開機指令碼會在虛擬機器 (VM) 的啟動程序中執行工作。本頁面提供相關步驟,說明如何在 VM 執行個體上使用開機指令碼。
事前準備
如要使用 gdcloud
指令列介面 (CLI) 指令,請務必下載、安裝及設定 gdcloud
CLI。GDC 氣隙裝置的所有指令都使用 gdcloud
或 kubectl
CLI,且需要作業系統 (OS) 環境。
取得 kubeconfig 檔案路徑
如要對 Management API 伺服器執行指令,請確認您具備下列資源:
找出 Management API 伺服器名稱,或詢問平台管理員 (PA) 伺服器名稱。
登入並產生 Management API 伺服器的 kubeconfig 檔案 (如果沒有)。
請使用路徑取代這些操作說明中的
MANAGEMENT_API_SERVER{"</var>"}}
。
要求權限和存取權
如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。請按照步驟驗證存取權,或請專案 IAM 管理員在 VM 所在的專案命名空間中,指派專案 VirtualMachine 管理員 (project-vm-admin
) 角色給您。
傳遞開機指令碼
您可以使用 bash 或非 bash 指令碼做為啟動指令碼。如要這麼做,請在指令碼開頭加入 #!/bin/…
,指出指令碼解譯器。舉例來說,如要使用 Python 3 開機指令碼,請在指令碼開頭新增 #! /usr/bin/python3
。
Google Distributed Cloud (GDC) 實體隔離設備會依據每個啟動指令碼的名稱,按字母順序執行啟動指令碼。
下表列出不同大小的腳本應使用的格式:
腳本大小 | 腳本格式 |
---|---|
指令碼最多 2048 個位元組 | 清除文字 |
指令碼超過 2048 個位元組 | Kubernetes Secret |
定義開機指令碼
如要使用啟動指令碼,您必須將 startupScripts
欄位新增至 VM spec
欄位。您可以在這個欄位中,以純文字或 Kubernetes 密碼的形式指定多個啟動指令碼。
以下範例會將啟動指令碼指定為純文字和 Kubernetes 密鑰:
apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
…
startupScripts:
- name: hello-world
script: |
#!/bin/bash
echo hello
- name: add-user
scriptSecretRef:
name: add-user
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: add-user
data:
script:
IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
請注意下列事項:
- 開機指令碼會在每次開機時執行。
- 開機指令碼預設具有根權限。
- 在 Kubernetes 密鑰中,VM
spec
中的scriptSecretRef
名稱必須與metadata.name
欄位相符。 - 在 Kubernetes 密鑰中,將
script
鍵新增至data
欄位,指定開機指令碼內容。
使用啟動指令碼建立新的 VM
無論您使用哪個映像檔建立 VM,都適用這些操作說明。完成下列步驟:
如要將開機指令碼建立為 Kubernetes 密鑰,請執行下列指令:
cat <<EOF >>FILE_NAME STARTUP_SCRIPT_CONTENT EOF
kubectl --kubeconfig MANAGEMENT_API_SERVER create secret -n PROJECT generic SECRET_NAME --from-file=script=FILE_NAME
rm FILE_NAME
請參閱「建立 VM」頁面所述步驟建立 VM。在步驟一中,請先在
spec
欄位中新增啟動指令碼,再執行指令建立 VM。這個範例定義的開機指令碼同時包含明文和 Kubernetes 密鑰:
apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME namespace: PROJECT spec: … startupScripts: - name: CLEAR_TEXT_SCRIPT_NAME script: | #!/bin/bash CLEAR_TEXT_SCRIPT - name: SECRET_SCRIPT_NAME scriptSecretRef: name: SECRET_NAME
這些變數的定義如下:
變數 定義 MANAGEMENT_API_SERVER
管理 API 伺服器 kubeconfig
檔案。PROJECT
您要在其中建立 VM 的 GDC 氣隙裝置專案。 VM_NAME
VM 名稱。 FILE_NAME
儲存啟動指令碼的檔案名稱。 STARTUP_SCRIPT_CONTENT
要執行的指令 (屬於開機指令碼的一部分) CLEAR_TEXT_SCRIPT_NAME
明文啟動指令碼的名稱。 CLEAR_TEXT_SCRIPT
您定義的明文指令碼。 SECRET_NAME
Kubernetes Secret 的名稱。 SECRET_SCRIPT_NAME
開機指令碼的名稱 (Kubernetes 密鑰)。 請按照下列步驟建立 VM。
以下範例說明如何使用開機指令碼建立 VM,並透過 Kubernetes 密鑰和明文新增使用者。
kubectl --kubeconfig MANAGEMENT_API_SERVER \ apply -n PROJECT -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineDisk metadata: name: VM_BOOT_DISK_NAME spec: source: image: name: BOOT_DISK_IMAGE_NAME namespace: vm-system size: BOOT_DISK_SIZE --- apiVersion: v1 kind: Secret type: Opaque metadata: name: add-user data: script: IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg== --- apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME spec: compute: virtualMachineType: MACHINE_TYPE disks: - virtualMachineDiskRef: name: VM_BOOT_DISK_NAME boot: true autoDelete: BOOT_DISK_AUTO_DELETE startupScripts: - name: add-user scriptSecretRef: name: add-user - name: add-to-sudoers script: | #!/bin/bash usermod -aG sudo user EOF
在範例中,變數定義如下。
變數 定義 MANAGEMENT_API_SERVER
管理 API 伺服器 kubeconfig
檔案。PROJECT
您要在其中建立 VM 的 GDC 氣隙裝置專案。 VM_NAME
新 VM 的名稱。 VM_BOOT_DISK_NAME
新 VM 開機磁碟的名稱。 BOOT_DISK_IMAGE_NAME
新 VM 開機磁碟要使用的映像檔名稱。 BOOT_DISK_SIZE
開機磁碟大小,例如 20G
。
這個值必須一律大於或等於開機磁碟映像檔的minimumDiskSize
。BOOT_DISK_AUTO_DELETE
true
或false
,指出刪除 VM 執行個體時,是否要自動刪除開機磁碟。MACHINE_TYPE
新 VM 的預先定義機器類型。如要選取可用的機器類型,請執行下列指令:
kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system
使用開機指令碼更新現有 VM
您也可以使用開機指令碼更新現有 VM。您必須先關閉 VM,才能執行更新。
按照步驟更新 VM 屬性,並使用要執行的開機指令碼更新 spec
欄位。
查看開機指令碼的輸出內容
- 按照步驟連線至 VM。
在客層 VM 內執行下列指令,取得您執行的啟動指令碼記錄:
sudo journalctl -u cloud-final
開機指令碼記錄檔開頭如下:
Started to run the command: /var/lib/google/startup-scripts/<script-name> ...