在 Windows VM 中使用開機指令碼

開機指令碼會在虛擬機器 (VM) 的啟動程序中執行工作。本頁面提供在 Windows VM 執行個體上使用啟動指令碼的步驟。如要進一步瞭解 Windows VM,請參閱「建立及管理 Windows VM」。

事前準備

如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。 Distributed Cloud 的所有指令都使用 gdcloudkubectl CLI,且需要 Linux 環境。

取得 kubeconfig 檔案路徑

如要對 Management API 伺服器執行指令,請確認您具備下列資源:

  1. 登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。

  2. 使用 Management API 伺服器的 kubeconfig 檔案路徑,取代這些操作說明中的 MANAGEMENT_API_SERVER

要求權限和存取權

如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。請按照步驟驗證存取權,或請專案 IAM 管理員在 VM 所在的專案命名空間中,指派專案 VirtualMachine 管理員 (project-vm-admin) 角色給您。

設定 Windows 啟動指令碼名稱格式

Windows VM 的啟動指令碼必須採用特定命名格式,並以破折號分隔指令碼名稱和附加的副檔名。舉例來說,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 之前執行。

下列 VM 規格顯示 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 欄位新增至 VM spec 欄位。您可以在這個欄位中,以純文字或 Kubernetes 密碼的形式指定多個啟動指令碼。

以下範例會將啟動指令碼指定為純文字和 Kubernetes 密鑰:

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 密鑰中,VM spec 中的 scriptSecretRef 名稱必須與 metadata.name 欄位相符。
  • 在 Kubernetes 密鑰中,將 script 鍵新增至 data 欄位,指定開機指令碼內容。

使用 Windows 開機指令碼建立新的 VM

如要使用 Windows 開機指令碼建立 VM,請按照「使用開機指令碼建立新的 VM」一文中的步驟操作。