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

启动脚本用于在虚拟机 (VM) 的启动过程中执行任务。本文档介绍了在虚拟机实例上使用启动脚本时要遵循的步骤。

启动脚本是一种自动化工具,用于在虚拟机启动过程中执行任务。使用启动脚本在新实例或现有实例上自动执行虚拟机配置和部署任务,从而节省时间并减少手动配置工作。

本文档适用于希望在 Distributed Cloud 环境中为虚拟机使用启动脚本的平台管理员或应用运维人员群组中的开发者。如需了解详情,请参阅适用于 GDC 网闸隔离配置文档的受众群体。

准备工作

如需使用 gdcloud 命令行界面 (CLI) 命令,请确保您已下载、安装并配置 gdcloud CLI。Distributed Cloud 的所有命令都使用 gdcloud 或 kubectl CLI,并且需要操作系统 (OS) 环境。

获取 kubeconfig 文件路径

如需针对 Management API 服务器运行命令,请确保您拥有以下资源:

  1. 如果您没有 Management API 服务器的 kubeconfig 文件,请登录并生成该文件。

  2. 在这些说明中,请使用 Management API 服务器的 kubeconfig 文件的路径替换 MANAGEMENT_API_SERVER。

申请 IAM 角色

如需为虚拟机使用启动脚本,请与您的 IAM 项目管理员联系,请求在您的项目中授予以下角色:

  • Virtual Machine Project Admin (project-vm-admin):在项目命名空间中创建、修改、列出和删除虚拟机。

  • Secret Admin (secret-admin):在项目命名空间中获取、列出、创建、更新、删除、修补和监视 Kubernetes Secret。使用此角色指定启动脚本 Secret。您无需此角色即可指定纯文本启动脚本。

所有虚拟机角色都必须绑定到虚拟机所在项目的命名空间。 按照相关步骤验证您的访问权限。

设置 Windows 启动脚本名称的格式

Windows 虚拟机的启动脚本必须遵循特定的命名格式,其中附加了脚本名称和文件扩展名,并以短划线分隔。例如,create-directory-ps1,其中 create-directory 为脚本名称,ps1 为文件扩展名。不正确的格式包括使用英文句点代替短划线以及省略文件扩展名,例如 create-directory.ps1 和 create-directory。

下表显示了 Windows 启动脚本要使用的文件扩展名:

  • ps1:包含 PowerShell 命令。
  • cmd:包含命令提示符解释器的批处理命令。
  • bat:包含批处理命令。

按顺序运行 Windows 启动脚本

您可以使用多个启动脚本。包含脚本的文件类型会影响每个脚本的运行顺序。下表显示了运行 Windows 启动脚本的顺序:

Windows 脚本 运行顺序
PowerShell 脚本 每次启动时首先运行。
批处理脚本 每次启动时。
命令脚本 第三次在每次启动时。

如果两个启动脚本具有相同的文件扩展名,则脚本会根据文件扩展名和名称按字母顺序运行。例如,如果启动脚本名称为 alpha-script-ps1 和 beta-script-ps1,则 alpha-script-ps1 会在 beta-script-ps1 之前运行。

以下虚拟机规范示例展示了 startupScripts 字段中的 Windows 启动脚本顺序和结构:

# …
  startupScripts:
  - name: create-directory-ps1
    script: |-
      New-Item -ItemType Directory -Path C:\ -Name NewDir
      Get-ChildItem -Path C:\
  - name: hello-world-bat
    script: |-
      ECHO "Hello World!"
  - name: list-directories-cmd
    script: |-
      dir C:\Windows  > files.txt
# …

传递启动脚本

Distributed Cloud 会根据每个启动脚本的名称,按字母顺序运行启动脚本。

下表显示了根据脚本大小应使用的脚本格式:

脚本大小 脚本格式
脚本大小上限为 2048 字节 清除文字
大于 2048 字节的脚本 Kubernetes Secret

定义启动脚本

如需使用启动脚本,您必须将 startupScripts 字段添加到虚拟机 spec 字段。在此字段中,您可以将多个启动脚本指定为明文或 Kubernetes Secret。

以下示例将启动脚本指定为明文和 Kubernetes Secret:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "vm-test"
spec:
  # …
  startupScripts:
  - name: create-directory-ps1
    script: |-
      New-Item -ItemType Directory -Path C:\ -Name NewDir
      Get-ChildItem -Path C:\
  - name: list-directories-cmd
    scriptSecretRef:
      name: list-directories
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: list-directories
data:
  script:
    ZGlyIEM6XFdpbmRvd3MgID4gZmlsZXMudHh0Cg==

请查看以下注意事项:

  • 启动脚本会在每次启动时运行。
  • 启动脚本具有默认根权限。
  • 在 Kubernetes Secret 中,虚拟机 spec 中的 scriptSecretRef 的名称必须与 metadata.name 字段匹配。
  • 在 Kubernetes Secret 中,通过向 data 字段添加键 script 来指定启动脚本内容。

使用 Windows 启动脚本创建新虚拟机

如需创建具有 Windows 启动脚本的虚拟机,请按照使用启动脚本创建新虚拟机中的步骤操作。