在 Windows VM 中使用開機指令碼

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

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

本文適用對象為平台管理員或應用程式操作員群組中的開發人員,他們想在 Distributed Cloud 環境中,為 VM 使用開機指令碼。詳情請參閱「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 角色

如要為 VM 使用開機指令碼,請與 IAM 專案管理員聯絡,要求在專案中取得下列角色:

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

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

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

設定 Windows 開機指令碼名稱的格式

Windows VM 的開機指令碼必須遵循特定命名格式,並附加指令碼名稱和副檔名,並以破折號分隔。例如 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 之前執行。

下列 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 密鑰

定義開機指令碼

如要使用開機指令碼,您必須在 VM spec 欄位中新增 startupScripts 欄位。您可以在這個欄位中,以明文或 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」中的步驟操作。