在 Windows 虚拟机上使用启动脚本


启动脚本是一种文件,用于在虚拟机实例 (VM) 的启动过程中执行任务。启动脚本可以应用于项目中的所有虚拟机或单个虚拟机。虚拟机级层元数据指定的启动脚本会替换项目级层元数据指定的启动脚本,并且启动脚本仅在网络可用时运行。本文档介绍如何在 Windows Server 虚拟机实例上使用启动脚本。如需了解如何添加项目级层启动脚本,请参阅 gcloud compute project-info add-metadata

Windows 启动脚本必须是 Command Shell (.cmd)、PowerShell (.ps1) 或批量文件脚本 (.bat),并且必须具有适当的文件扩展名。

如果您使用本文档中的某个过程来指定启动脚本,Compute Engine 将执行以下操作:

  1. 将启动脚本复制到虚拟机

  2. 任务调度器会在虚拟机启动时以 LocalSystem 账号 的身份运行启动脚本

如需了解与启动脚本相关的各种任务以及何时执行各个任务,请参阅启动脚本概览文档

准备工作

  • 阅读启动脚本概览
  • 了解虚拟机元数据的基础知识。
  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

Windows 启动脚本的元数据键

启动脚本将从元数据键指定的位置传递给虚拟机。元数据键指定启动脚本是存储在本地、存储在 Cloud Storage 中,还是直接传递给虚拟机。您使用的元数据键可能还取决于启动脚本的大小或文件类型。

下表显示可用于 Windows 启动脚本的元数据键,并提供根据启动脚本的存储位置、大小和文件类型要使用哪个键的相关信息。

元数据键 用于
sysprep-specialize-script-ps1 传递在本地存储或直接添加且大小最大为 256 KB 的未签名 PowerShell 脚本
sysprep-specialize-script-cmd 传递在本地存储或直接添加且大小最大为 256 KB 的命令 Shell 脚本
sysprep-specialize-script-bat 传递在本地存储或直接添加且大小最大为 256 KB 的批量文件脚本
sysprep-specialize-script-url 传递存储在 Cloud Storage 中且大小超过 256 KB 的批处理文件、命令 shell、已签名/未签名的 PowerShell 脚本或可执行文件
windows-startup-script-ps1 传递在本地存储或直接添加且大小最大为 256 KB 的未签名 PowerShell 脚本
windows-startup-script-cmd 传递在本地存储或直接添加且大小最大为 256 KB 的命令 Shell 脚本
windows-startup-script-bat 传递在本地存储或直接添加且大小最大为 256 KB 的批量文件脚本
windows-startup-script-url 传递存储在 Cloud Storage 中且大小超过 256 KB 的批处理文件、命令 shell、已签名/未签名的 PowerShell 脚本或可执行文件

如需详细了解各种类型的启动脚本的执行顺序,请参阅 GitHub 上的 GoogleCloudPlatform/compute-image-windows 代码库。

Windows 启动脚本的执行顺序

您可以使用多个启动脚本。存储在本地或直接添加的启动脚本会在 Cloud Storage 中存储的启动脚本之前执行。包含脚本的文件类型也会影响执行顺序。下表根据元数据键显示 Windows 启动脚本的执行顺序。

元数据键 执行顺序
sysprep-specialize-script-ps1 初始启动期间第一次
sysprep-specialize-script-cmd 初始启动期间第二次
sysprep-specialize-script-bat 初始启动期间第三次
sysprep-specialize-script-url 初始启动期间第四次
windows-startup-script-ps1 初始启动后每次启动期间的第一次
windows-startup-script-cmd 初始启动后每次启动期间的第二次
windows-startup-script-bat 初始启动后每次启动期间的第三次
windows-startup-script-url 初始启动后每次启动期间的第四次

直接传递 Windows 启动脚本

将批量文件、命令 shell 或未签名的 PowerShell 启动脚本的内容直接传递到 Windows Server 虚拟机。以下过程介绍如何传递未签名的 PowerShell 脚本。

控制台

将 Windows 启动脚本直接传递到新虚拟机

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    打开“创建实例”

  2. 对于启动磁盘,选择更改,然后执行以下操作:

    1. 公共映像标签页上,选择 Windows Server 操作系统。
    2. 点击选择
  3. 展开高级选项部分,然后执行以下操作:

    1. 展开管理部分。
    2. 元数据部分中,点击添加一项以设置

      • :设置为 windows-startup-script-ps1

        在虚拟机初始启动之后,每次启动时使用以 windows-startup-script 开头的元数据键传递到虚拟机的启动脚本都会运行。

      • :添加以下脚本:

        # Installing IIS
        Import-Module servermanager
        Install-WindowsFeature Web-Server -IncludeAllSubFeature
        
        # Ensure the directory exists
        if (-not (Test-Path("C:\inetpub\wwwroot"))) {New-Item "C:\inetpub\wwwroot" -Type Directory}
        
        # Write the expanded string out to the file, overwriting the file if it already exists.
        "<html><body><p>Windows startup script added directly.</p></body></html>" | Out-File -FilePath C:\inetpub\wwwroot\index.html -Encoding ascii -Force
        
  4. 点击创建

将 Windows 启动脚本直接传递到现有虚拟机

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击虚拟机的名称

  3. 点击修改

  4. 元数据下,指定以下内容:

    • keywindows-startup-script-ps1
    • value:启动脚本的内容

验证启动脚本

虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud (Bash)

将 Windows 启动脚本直接传递到新虚拟机

创建时使用以下 gcloud compute instances create 命令将启动脚本的内容直接传递到 Windows Server 虚拟机:

gcloud compute instances create VM_NAME \
  --image-project=windows-cloud \
  --image-family=windows-2019-core \
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

将 Windows 启动脚本直接传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将启动脚本直接添加到现有虚拟机:

gcloud compute instances add-metadata VM_NAME \
  --image-project=windows-cloud \
  --image-family=windows-2019-core \
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

验证启动脚本

虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本是否创建了网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud(命令提示符)

将 Windows 启动脚本直接传递到新虚拟机

创建时使用以下 gcloud compute instances create 命令将启动脚本的内容直接传递到 Windows Server 虚拟机:

gcloud compute instances create VM_NAME ^
  --image-project=windows-cloud ^
  --image-family=windows-2019-core ^
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

将 Windows 启动脚本直接传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将启动脚本直接添加到现有虚拟机:

gcloud compute instances add-metadata VM_NAME ^
  --image-project=windows-cloud ^
  --image-family=windows-2019-core ^
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

验证启动脚本

虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本是否创建了网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud (PowerShell)

将 Windows 启动脚本直接传递到新虚拟机

创建时使用以下 gcloud compute instances create 命令将启动脚本的内容直接传递到 Windows Server 虚拟机:

gcloud compute instances create VM_NAME `
  --image-project=windows-cloud `
  --image-family=windows-2019-core `
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

将 Windows 启动脚本直接传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将启动脚本直接添加到现有虚拟机:

gcloud compute instances add-metadata VM_NAME `
  --image-project=windows-cloud `
  --image-family=windows-2019-core `
  --metadata=windows-startup-script-ps1='Import-Module servermanager
  Install-WindowsFeature Web-Server -IncludeAllSubFeature
  "<html><body><p>Windows startup script added directly.</p></body></html>" > C:\inetpub\wwwroot\index.html'

VM_NAME 替换为虚拟机名称。

验证启动脚本

虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本是否创建了网站。您可能必须等待约 10 分钟来完成示例启动脚本。

REST

将 Windows 启动脚本直接传递到新虚拟机

创建时使用以下 instances.insert 方法将启动脚本的内容直接传递到 Windows Server 虚拟机:

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "windows-startup-script-ps1",
        "value": "Import-Module servermanager\nInstall-WindowsFeature Web-Server -IncludeAllSubFeature\necho '<html><body><p>Windows startup script added directly.</p></body></html>' > C:\\inetpub\\wwwroot\\index.html"
      }
    ]
  },
  ...
}

请替换以下内容:

  • PROJECT_ID:项目 ID

  • ZONE:要在其中创建新虚拟机的可用区

将 Windows 启动脚本直接传递到现有虚拟机

  1. 使用 instances.get 方法获取虚拟机的 tags.fingerprint 值。

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    请替换以下内容:

    • PROJECT_ID:项目 ID

    • ZONE:虚拟机的可用区

    • VM_NAME:虚拟机所在的区域

  2. 在对 instances.setMetadata 方法 的调用中使用 fingerprint 值以及启动脚本的元数据键和值来传递启动脚本:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
     "fingerprint": FINGERPRINT,
     "items": [
       {
         "key": "windows-startup-script-ps1",
         "value": "Import-Module servermanager\nInstall-WindowsFeature Web-Server -IncludeAllSubFeature\necho '<html><body><p>Windows startup script added directly.</p></body></html>' > C:\\inetpub\\wwwroot\\index.html"
       }
     ],
     ...
    }
    

    请替换以下内容:

    • PROJECT_ID:项目 ID

    • ZONE:虚拟机的可用区

    • VM_NAME:虚拟机所在的区域

    • FINGERPRINT:使用 instances.get 方法获取的 tags.fingerprint

验证启动脚本

虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

从本地文件传递 Windows 启动脚本

您可以将启动脚本存储在工作站上的本地批量文件、命令 shell 脚本或未签名的 PowerShell 脚本中,并在创建时将本地文件作为元数据传递到虚拟机。您不能将虚拟机上存储的文件用作启动脚本。

在将 Windows 启动脚本从本地文件传递到虚拟机之前,请执行以下操作:

  1. 创建本地 (.ps1) 文件以存储启动脚本。

  2. 请注意从 gcloud CLI 到启动脚本的相对路径。

  3. 将以下启动脚本添加到文件:

    # Installing IIS
    Import-Module servermanager
    Install-WindowsFeature Web-Server -IncludeAllSubFeature
    
    # Ensure the directory exists
    if (-not (Test-Path("C:\inetpub\wwwroot"))) {New-Item "C:\inetpub\wwwroot" -Type Directory}
    
    # Write the expanded string out to the file, overwriting the file if it already exists.
    "<html><body><p>Windows startup script passed from a file on your local workstation.</p></body></html>" | Out-File -FilePath C:\inetpub\wwwroot\index.html -Encoding ascii -Force
    

gcloud (Bash)

将 Windows 启动脚本从本地文件传递到新虚拟机

使用带有 --metadata-from-file 标志的 gcloud compute instances create 命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:

gcloud compute instances create VM_NAME \
  --image-project=windows-cloud \
  --image-family=windows-2019-core \
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
将 Windows 启动脚本从本地文件传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令,将本地文件从本地文件传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME \
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud(命令提示符)

将 Windows 启动脚本从本地文件传递到新虚拟机

使用带有 --metadata-from-file 标志的 gcloud compute instances create 命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:

gcloud compute instances create VM_NAME ^
  --image-project=windows-cloud ^
  --image-family=windows-2019-core ^
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
将 Windows 启动脚本从本地文件传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令,将本地文件从本地文件传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME ^
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud (PowerShell)

将 Windows 启动脚本从本地文件传递到新虚拟机

使用带有 --metadata-from-file 标志的 gcloud compute instances create 命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:

gcloud compute instances create VM_NAME `
  --image-project=windows-cloud `
  --image-family=windows-2019-core `
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
将 Windows 启动脚本从本地文件传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令,将本地文件从本地文件传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME `
  --metadata-from-file=windows-startup-script-ps1=FILE_PATH

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • FILE_PATH:启动脚本文件的相对路径
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

从 Cloud Storage 传递 Windows 启动脚本

您可以将启动脚本作为批处理文件、命令 Shell 脚本、已签名/未签名的 PowerShell 脚本或可执行文件存储在 Cloud Storage 中,并在创建虚拟机时将该脚本传递到虚拟机。将启动脚本添加到 Cloud Storage 后,您将获得一个网址,用于在创建虚拟机时引用启动脚本。

在从 Cloud Storage 存储桶添加启动脚本之前,请执行以下操作:

  1. 创建文件以存储启动脚本。本示例使用 PowerShell (.ps1) 文件。

  2. 将以下 PowerShell 脚本添加到该文件中,该脚本将安装网络服务器并创建一个简单的网页:

    # Installing IIS
    Import-Module servermanager
    Install-WindowsFeature Web-Server -IncludeAllSubFeature
    
    # Ensure the directory exists
    if (-not (Test-Path("C:\inetpub\wwwroot"))) {New-Item "C:\inetpub\wwwroot" -Type Directory}
    
    # Write the expanded string out to the file, overwriting the file if it already exists.
    "<html><body><p>Windows startup script passed from Cloud Storage.</p></body></html>" | Out-File -FilePath C:\inetpub\wwwroot\index.html -Encoding ascii -Force
    
  3. 创建 Cloud Storage 存储分区

  4. 将文件添加到 Cloud Storage 存储桶

安全注意事项

  • 默认情况下,项目所有者和项目编辑者可以访问同一项目中的 Cloud Storage 文件,除非有显式访问权限控制禁止这么做。

  • 如果 Cloud Storage 存储分区或对象的安全性低于元数据,则在修改启动脚本和虚拟机重新启动时,存在提权风险。这是因为虚拟机重新启动后,启动脚本会作为 LocalSystem 运行,然后可以使用关联服务账号的权限访问其他资源。

控制台

将存储在 Cloud Storage 中的启动脚本传递到新虚拟机

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    打开“创建实例”

  2. 对于启动磁盘,选择更改,然后执行以下操作:

    1. 公共映像标签页上,选择 Windows Server 操作系统。
    2. 点击选择
  3. 身份和 API 访问权限部分,选择具有 Storage Object Viewer 角色的服务账号。

  4. 展开高级选项部分,然后执行以下操作:

    1. 展开管理部分。
    2. 元数据部分中,添加以下内容的值:

      • :元数据键。指定 windows-startup-script-url 元数据键,以便脚本在初始启动后在每次启动期间都运行。

      • :元数据值。使用以下格式之一设置启动脚本文件的 Cloud Storage 位置:

        • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
        • gsutil URIgs://BUCKET/FILE

        请替换以下内容:

        • BUCKET:包含启动脚本文件的存储桶的名称
        • FILE:启动脚本文件的名称
  5. 如需创建虚拟机,请点击创建

将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机

  1. 在 Google Cloud 控制台中,前往虚拟机实例页面。

    转到虚拟机实例

  2. 点击虚拟机的名称

  3. 点击修改

  4. 元数据下,添加以下值:

    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE

验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud (Bash)

将存储在 Cloud Storage 中的启动脚本传递到新虚拟机

使用以下 gcloud compute instances create 命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes 标志的值,使用 storage-ro,以便虚拟机可以访问 Cloud Storage。

gcloud compute instances create VM_NAME \
  --image-project=windows-cloud \
  --image-family=windows-2019-core \
  --scopes=storage-ro \
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME \
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud(命令提示符)

将存储在 Cloud Storage 中的启动脚本传递到新虚拟机

使用以下 gcloud compute instances create 命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes 标志的值,使用 storage-ro,以便虚拟机可以访问 Cloud Storage。

gcloud compute instances create VM_NAME ^
  --image-project=windows-cloud ^
  --image-family=windows-2019-core ^
  --scopes=storage-ro ^
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME ^
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

gcloud (PowerShell)

将存储在 Cloud Storage 中的启动脚本传递到新虚拟机

使用以下 gcloud compute instances create 命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes 标志的值,使用 storage-ro,以便虚拟机可以访问 Cloud Storage。

gcloud compute instances create VM_NAME `
  --image-project=windows-cloud `
  --image-family=windows-2019-core `
  --scopes=storage-ro `
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机

使用以下 gcloud compute instances add-metadata 命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:

gcloud compute instances add-metadata VM_NAME `
  --metadata=windows-startup-script-url=CLOUD_STORAGE_URL

请替换以下内容:

  • VM_NAME:虚拟机的名称。
  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE
验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

REST

将存储在 Cloud Storage 中的启动脚本传递到新虚拟机

使用以下 instances.insert 方法将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。在 scopes 字段中,添加 https://www.googleapis.com/auth/devstorage.read_only,以便虚拟机可以访问 Cloud Storage。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances

{
  ...
  "networkInterfaces": [
    {
      "accessConfigs": [
        {
          "type": "ONE_TO_ONE_NAT"
        }
      ]
    }
  ],
  "serviceAccounts": [
    {
      "email": "default",
      "scopes": [
        "https://www.googleapis.com/auth/devstorage.read_only"
      ]
    }
  ],
  "metadata": {
    "items": [
      {
        "key": "windows-startup-script-url",
        "value": "CLOUD_STORAGE_URL"
      },
      ...
    ]
  },
  ...
}

请替换以下内容:

  • PROJECT_ID:项目 ID。

  • ZONE:要在其中创建新虚拟机的可用区。

  • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置启动脚本文件的 Cloud Storage 位置:

    • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
    • gsutil URIgs://BUCKET/FILE

将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机

  1. 使用 instances.get 方法获取虚拟机的 tags.fingerprint 值。

    GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME
    

    请替换以下内容:

    • PROJECT_ID:项目 ID

    • ZONE:虚拟机的可用区

    • VM_NAME:虚拟机所在的区域

  2. 在对 instances.setMetadata 方法 的调用中使用 fingerprint 值以及启动脚本的元数据键和值来传递启动脚本:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/setMetadata
    
    {
      "fingerprint": FINGERPRINT,
      "items": [
        {
            "key": "windows-startup-script-url",
            "value": "CLOUD_STORAGE_URL"
        }
      ],
      ...
    }
    

    请替换以下内容:

    • PROJECT_ID:项目 ID。

    • ZONE:虚拟机的可用区。

    • VM_NAME:虚拟机的可用区。

    • FINGERPRINT:使用 instances.get 方法获取的 tags.fingerprint 值。

    • CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置启动脚本文件的 Cloud Storage 位置:

      • 要求验证身份的网址https://storage.googleapis.com/BUCKET/FILE
      • gsutil URIgs://BUCKET/FILE

验证启动脚本

在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。

从 Windows 启动脚本访问元数据

在启动脚本中,您可以访问元数据值。例如,您可以将同一个脚本用于多个虚拟机,并通过将不同的元数据值传递到每个虚拟机来单独对每个脚本进行参数化。

如需从启动脚本访问自定义元数据值,请执行以下操作:

  1. 创建用于查询元数据键值的启动脚本。例如,以下 PowerShell (.ps1) 启动脚本会查询 foo 元数据键的值。

    $METADATA_VALUE = (Invoke-RestMethod -Headers @{'Metadata-Flavor' = 'Google'} -Uri "http://metadata.google.internal/computeMetadata/v1/instance/attributes/foo")
    
    # Installing IIS
    Import-Module servermanager
    Install-WindowsFeature Web-Server -IncludeAllSubFeature
    
    # Ensure the directory exists
    if (-not (Test-Path("C:\inetpub\wwwroot"))) {New-Item "C:\inetpub\wwwroot" -Type Directory}
    
    # Write the expanded string out to the file, overwriting the file if it already exists.
    "<html><body><p>Accessing metadata value of foo: $METADATA_VALUE</p></body></html>" | Out-File -FilePath C:\inetpub\wwwroot\index.html -Encoding ascii -Force
    
  2. 在创建虚拟机时使用以下 gcloud compute instances create 命令设置 foo 元数据键的值。在本示例中,将启动脚本从本地文件传递到虚拟机。

    gcloud

    gcloud compute instances create VM_NAME \
      --image-project=windows-cloud \
      --image-family=windows-2019 \
      --metadata-from-file=windows-startup-script-ps1=FILE_PATH \
      --metadata=foo=bar
    

    请替换以下内容:

    • VM_NAME:虚拟机的名称

    • FILE_PATH:启动脚本文件的相对路径

    如需详细了解如何指定元数据键值对,请参阅设置和移除自定义元数据

  3. 在网络浏览器中查看外部 IP,以验证启动脚本是否输出 foo 的值。您可能必须等待约 10 分钟来完成示例启动脚本。

重新运行 Windows 启动脚本

通过执行以下操作,在 Windows 虚拟机上重新运行启动脚本:

  1. 连接到虚拟机

  2. 运行以下命令:

    C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd
    

查看 Windows 启动脚本的输出

使用以下任一项并检查是否有 GCEMetadataScripts 事件,查看 Windows Server 启动脚本的输出:

后续步骤