開機指令碼會在虛擬機器 (VM) 啟動程序中執行工作。本文提供在 VM 執行個體上使用開機指令碼的步驟。
開機指令碼是一種自動化工具,可在 VM 啟動程序中執行工作。使用開機指令碼,在新執行個體或現有執行個體上自動執行 VM 設定和部署工作,節省時間並減少手動設定作業。
本文適用對象為平台管理員或應用程式操作員群組中的開發人員,他們想在 Distributed Cloud 環境中,為 VM 使用開機指令碼。詳情請參閱「GDC 實體隔離方案說明文件的目標對象」。
事前準備
如要使用 gdcloud 指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud CLI。Distributed Cloud 的所有指令都使用 gdcloud 或 kubectl CLI,且需要作業系統 (OS) 環境。
取得 kubeconfig 檔案路徑
如要對 Management API 伺服器執行指令,請確認您具備下列資源:
如果您沒有 Management API 伺服器的 kubeconfig 檔案,請登入並產生該檔案。
請使用 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」中的步驟操作。