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

启动脚本用于在虚拟机 (VM) 的启动过程中执行任务。本页介绍了在 Windows 虚拟机实例上使用启动脚本的步骤。如需详细了解 Windows 虚拟机,请参阅创建和管理 Windows 虚拟机

准备工作

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

获取 kubeconfig 文件路径

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

  1. 登录并生成管理 API 服务器的 kubeconfig 文件(如果您还没有)。

  2. 使用管理 API 服务器的 kubeconfig 文件路径替换这些说明中的 MANAGEMENT_API_SERVER

请求权限和访问权限

如需执行本页面中列出的任务,您必须具有 Project VirtualMachine Admin 角色。按照相应步骤验证您的访问权限,或者让项目 IAM 管理员在虚拟机所在项目的命名空间中为您分配项目虚拟机管理员 (project-vm-admin) 角色。

Windows 启动脚本名称的格式

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

以下内容显示了要用于 Windows 启动脚本的文件扩展名:

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

按顺序运行 Windows 启动脚本

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

Windows 脚本 要运行的命令
PowerShell 脚本 每次启动时首次运行。
批处理脚本 每次启动时运行的第二个。
命令脚本 每次启动时的第三次。

如果两个启动脚本具有相同的文件扩展名,则系统会根据文件扩展名和名称按字母顺序运行这些脚本。例如,如果您的启动脚本名称为 alpha-script-ps1beta-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==

请查看以下注意事项:

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

创建具有 Windows 启动脚本的新虚拟机

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