启动脚本是一种文件,用于在虚拟机实例 (VM) 的启动过程中执行任务。启动脚本可以应用于项目中的所有虚拟机或单个虚拟机。虚拟机级层元数据指定的启动脚本会替换项目级层元数据指定的启动脚本,并且启动脚本仅在网络可用时运行。本文档介绍如何在 Windows Server 虚拟机实例上使用启动脚本。如需了解如何添加项目级层启动脚本,请参阅 gcloud compute project-info add-metadata
。
Windows 启动脚本必须是 Command Shell (.cmd
)、PowerShell (.ps1
) 或批量文件脚本 (.bat
),并且必须具有适当的文件扩展名。
如果您使用本文档中的某个过程来指定启动脚本,Compute Engine 将执行以下操作:
将启动脚本复制到虚拟机
任务调度器会在虚拟机启动时以
LocalSystem
账号的身份运行启动脚本
如需了解与启动脚本相关的各种任务以及何时执行各个任务,请参阅启动脚本概览文档。
准备工作
- 阅读启动脚本概览。
- 了解虚拟机元数据的基础知识。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以选择以下任一选项向 Compute Engine 进行身份验证:
Select the tab for how you plan to use the samples on this page:
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
-
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 启动脚本
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 创建新虚拟机所需的所有权限。
-
针对虚拟机的
compute.instances.setMetadata
权限。
将批量文件、命令 shell 或未签名的 PowerShell 启动脚本的内容直接传递到 Windows Server 虚拟机。以下过程介绍如何传递未签名的 PowerShell 脚本。
将 Windows 启动脚本直接传递到新虚拟机
在 Google Cloud 控制台中,前往创建实例页面。
对于启动磁盘,选择更改,然后执行以下操作:
- 在公共映像标签页上,选择 Windows Server 操作系统。
- 点击选择。
展开高级选项部分,然后执行以下操作:
- 展开管理部分。
在元数据部分中,点击添加一项以设置键和值:
键:设置为
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
点击创建。
将 Windows 启动脚本直接传递到现有虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击虚拟机的名称。
点击修改。
在元数据下,指定以下内容:
key
:windows-startup-script-ps1
value
:启动脚本的内容
验证启动脚本
虚拟机启动后,在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将 Windows 启动脚本直接传递到新虚拟机
创建时使用以下 gcloud compute
instances create
命令将启动脚本的内容直接传递到 Windows Server 虚拟机:
gcloud compute instances createVM_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-metadataVM_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 分钟来完成示例启动脚本。
将 Windows 启动脚本直接传递到新虚拟机
创建时使用以下 gcloud compute
instances create
命令将启动脚本的内容直接传递到 Windows Server 虚拟机:
gcloud compute instances createVM_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-metadataVM_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 分钟来完成示例启动脚本。
将 Windows 启动脚本直接传递到新虚拟机
创建时使用以下 gcloud compute
instances create
命令将启动脚本的内容直接传递到 Windows Server 虚拟机:
gcloud compute instances createVM_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-metadataVM_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 分钟来完成示例启动脚本。
将 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 启动脚本直接传递到现有虚拟机
使用
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:虚拟机所在的区域
在对
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 启动脚本
执行此任务所需的权限
您必须拥有以下权限才能执行此任务:
- 创建新虚拟机所需的所有权限。
-
针对虚拟机的
compute.instances.setMetadata
权限。
您可以将启动脚本存储在工作站上的本地批量文件、命令 shell 脚本或未签名的 PowerShell 脚本中,并在创建时将本地文件作为元数据传递到虚拟机。您不能将虚拟机上存储的文件用作启动脚本。
在将 Windows 启动脚本从本地文件传递到虚拟机之前,请执行以下操作:
创建本地 (
.ps1
) 文件以存储启动脚本。请注意从 gcloud CLI 到启动脚本的相对路径。
将以下启动脚本添加到文件:
# 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
将 Windows 启动脚本从本地文件传递到新虚拟机
使用带有 --metadata-from-file
标志的 gcloud compute instances create
命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:
gcloud compute instances createVM_NAME \ --image-project=windows-cloud \ --image-family=windows-2019-core \ --metadata-from-file=windows-startup-script-ps1=FILE_PATH
请替换以下内容:
- VM_NAME:虚拟机的名称
- FILE_PATH:启动脚本文件的相对路径
使用以下 gcloud compute instances add-metadata
命令,将本地文件从本地文件传递到现有虚拟机:
gcloud compute instances add-metadataVM_NAME \ --metadata-from-file=windows-startup-script-ps1=FILE_PATH
请替换以下内容:
- VM_NAME:虚拟机的名称
- FILE_PATH:启动脚本文件的相对路径
在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将 Windows 启动脚本从本地文件传递到新虚拟机
使用带有 --metadata-from-file
标志的 gcloud compute instances create
命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:
gcloud compute instances createVM_NAME ^ --image-project=windows-cloud ^ --image-family=windows-2019-core ^ --metadata-from-file=windows-startup-script-ps1=FILE_PATH
请替换以下内容:
- VM_NAME:虚拟机的名称
- FILE_PATH:启动脚本文件的相对路径
使用以下 gcloud compute instances add-metadata
命令,将本地文件从本地文件传递到现有虚拟机:
gcloud compute instances add-metadataVM_NAME ^ --metadata-from-file=windows-startup-script-ps1=FILE_PATH
请替换以下内容:
- VM_NAME:虚拟机的名称
- FILE_PATH:启动脚本文件的相对路径
在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将 Windows 启动脚本从本地文件传递到新虚拟机
使用带有 --metadata-from-file
标志的 gcloud compute instances create
命令创建一个虚拟机,并传递要用作启动脚本的本地文件的内容:
gcloud compute instances createVM_NAME ` --image-project=windows-cloud ` --image-family=windows-2019-core ` --metadata-from-file=windows-startup-script-ps1=FILE_PATH
请替换以下内容:
- VM_NAME:虚拟机的名称
- FILE_PATH:启动脚本文件的相对路径
使用以下 gcloud compute instances add-metadata
命令,将本地文件从本地文件传递到现有虚拟机:
gcloud compute instances add-metadataVM_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 存储桶添加启动脚本之前,请执行以下操作:
创建文件以存储启动脚本。本示例使用 PowerShell (
.ps1
) 文件。将以下 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
安全注意事项
默认情况下,项目所有者和项目编辑者可以访问同一项目中的 Cloud Storage 文件,除非有显式访问权限控制禁止这么做。
如果 Cloud Storage 存储分区或对象的安全性低于元数据,则在修改启动脚本和虚拟机重新启动时,存在提权风险。这是因为虚拟机重新启动后,启动脚本会作为
LocalSystem
运行,然后可以使用关联服务账号的权限访问其他资源。
将存储在 Cloud Storage 中的启动脚本传递到新虚拟机
在 Google Cloud 控制台中,前往创建实例页面。
对于启动磁盘,选择更改,然后执行以下操作:
- 在公共映像标签页上,选择 Windows Server 操作系统。
- 点击选择。
在身份和 API 访问权限部分,选择具有 Storage Object Viewer 角色的服务账号。
展开高级选项部分,然后执行以下操作:
- 展开管理部分。
在元数据部分中,添加以下内容的值:
键:元数据键。指定
windows-startup-script-url
元数据键,以便脚本在初始启动后在每次启动期间都运行。值:元数据值。使用以下格式之一设置启动脚本文件的 Cloud Storage 位置:
- 要求验证身份的网址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
替换以下内容:
- BUCKET:包含启动脚本文件的存储桶的名称
- FILE:启动脚本文件的名称
- 要求验证身份的网址:
如需创建虚拟机,请点击创建。
将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击虚拟机的名称。
点击修改。
在元数据下,添加以下值:
- 要求验证身份的网址:
https://storage.googleapis.com/BUCKET/FILE
- gcloud storage URI:
gs://BUCKET/FILE
- 要求验证身份的网址:
验证启动脚本
在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将存储在 Cloud Storage 中的启动脚本传递到新虚拟机
使用以下 gcloud compute instances create
命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes
标志的值,使用 storage-ro
,以便虚拟机可以访问 Cloud Storage。
gcloud compute instances createVM_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
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
使用以下 gcloud compute instances add-metadata
命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:
gcloud compute instances add-metadataVM_NAME \ --metadata=windows-startup-script-url=CLOUD_STORAGE_URL
请替换以下内容:
- VM_NAME:虚拟机的名称。
-
CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
-
要求验证身份的网址:
https://storage.googleapis.com/BUCKET/FILE
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将存储在 Cloud Storage 中的启动脚本传递到新虚拟机
使用以下 gcloud compute instances create
命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes
标志的值,使用 storage-ro
,以便虚拟机可以访问 Cloud Storage。
gcloud compute instances createVM_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
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
使用以下 gcloud compute instances add-metadata
命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:
gcloud compute instances add-metadataVM_NAME ^ --metadata=windows-startup-script-url=CLOUD_STORAGE_URL
请替换以下内容:
- VM_NAME:虚拟机的名称。
-
CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
-
要求验证身份的网址:
https://storage.googleapis.com/BUCKET/FILE
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将存储在 Cloud Storage 中的启动脚本传递到新虚拟机
使用以下 gcloud compute instances create
命令将存储在 Cloud Storage 中的启动脚本传递到 Windows Server 虚拟机。对于 --scopes
标志的值,使用 storage-ro
,以便虚拟机可以访问 Cloud Storage。
gcloud compute instances createVM_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
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
使用以下 gcloud compute instances add-metadata
命令将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机:
gcloud compute instances add-metadataVM_NAME ` --metadata=windows-startup-script-url=CLOUD_STORAGE_URL
请替换以下内容:
- VM_NAME:虚拟机的名称。
-
CLOUD_STORAGE_URL:元数据值。使用以下格式之一设置为启动脚本文件的位置:
-
要求验证身份的网址:
https://storage.googleapis.com/BUCKET/FILE
-
gcloud storage URI:
gs://BUCKET/FILE
-
要求验证身份的网址:
在网络浏览器中查看外部 IP 以验证启动脚本是否已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
将存储在 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
- gcloud storage URI:
gs://BUCKET/FILE
- 要求验证身份的网址:
将存储在 Cloud Storage 中的启动脚本传递到现有虚拟机
使用
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:虚拟机所在的区域
在对
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
- gcloud storage URI:
gs://BUCKET/FILE
- 要求验证身份的网址:
验证启动脚本
在网络浏览器中查看外部 IP 以验证启动脚本已创建网站。您可能必须等待约 10 分钟来完成示例启动脚本。
从 Windows 启动脚本访问元数据
在启动脚本中,您可以访问元数据值。例如,您可以将同一个脚本用于多个虚拟机,并通过将不同的元数据值传递到每个虚拟机来单独对每个脚本进行参数化。
如需从启动脚本访问自定义元数据值,请执行以下操作:
创建用于查询元数据键值的启动脚本。例如,以下 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
在创建虚拟机时使用以下
gcloud compute instances create
命令设置foo
元数据键的值。在本示例中,将启动脚本从本地文件传递到虚拟机。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:启动脚本文件的相对路径
如需详细了解如何指定元数据键值对,请参阅设置和移除自定义元数据。
在网络浏览器中查看外部 IP,以验证启动脚本是否输出
foo
的值。您可能必须等待约 10 分钟来完成示例启动脚本。
重新运行 Windows 启动脚本
通过执行以下操作,在 Windows 虚拟机上重新运行启动脚本:
运行以下命令:
C:\Program Files\Google\Compute Engine\metadata_scripts\run_startup_scripts.cmd
查看 Windows 启动脚本的输出
使用以下任一项并检查是否有 GCEMetadataScripts
事件,查看 Windows Server 启动脚本的输出:
Google Cloud 控制台中的串行端口 1。如需了解详情,请参阅查看串行端口输出。
Windows 事件查看器的应用日志。
Windows 工作站上的 IAP 桌面。如需了解详情,请参阅 GitHub 上的 GoogleCloudPlatform/iap-desktop 代码库。
后续步骤
了解如何在 Linux 虚拟机上使用启动脚本。
了解如何添加关停脚本。
详细了解虚拟机元数据。