在 Windows VM 中使用開機指令碼

開機指令碼會在虛擬機器 (VM) 的啟動程序中執行工作。本文提供相關步驟,說明如何在 VM 執行個體上使用開機指令碼。

開機指令碼是一種自動化工具,可在 VM 啟動程序期間執行工作。使用開機指令碼,自動執行新執行個體或現有執行個體的 VM 設定和部署作業,節省時間並減少手動設定工作。

本文適用於平台管理員或應用程式運算子群組的開發人員,他們想在 Distributed Cloud 環境中使用 VM 的開機指令碼。詳情請參閱 GDC 氣隙環境適用的目標對象說明文件

事前準備

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

取得 kubeconfig 檔案路徑

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

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

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

要求 IAM 角色

如要在 VM 中使用啟動指令碼,請聯絡專案 IAM 管理員,要求在專案中授予下列角色:

  • 虛擬機器專案管理員 (project-vm-admin):在專案命名空間中建立、修改、列出及刪除 VM。

  • Secret 管理員 (secret-admin):在專案命名空間中取得、列出、建立、更新、刪除、修補及監控 Kubernetes Secret。使用這個角色指定開機指令碼密鑰。指定純文字啟動指令碼時,不需要這個角色。

所有 VM 角色都必須繫結至 VM 所在的專案命名空間。 按照步驟驗證存取權。

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

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

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