在 Linux VM 的 VM 執行個體中使用開機指令碼

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

事前準備

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

取得 kubeconfig 檔案路徑

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

  1. 找出 Management API 伺服器名稱,或詢問平台管理員 (PA) 伺服器名稱。

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

  3. 請使用路徑取代這些操作說明中的 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,都適用這些操作說明。完成下列步驟:

  1. 如要將開機指令碼建立為 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
    
  2. 請參閱「建立 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 密鑰)。
  3. 請按照下列步驟建立 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 truefalse,指出刪除 VM 執行個體時,是否要自動刪除開機磁碟。
    MACHINE_TYPE 新 VM 的預先定義機器類型。如要選取可用的機器類型,請執行下列指令:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

使用開機指令碼更新現有 VM

您也可以使用開機指令碼更新現有 VM。您必須先關閉 VM,才能執行更新。

按照步驟更新 VM 屬性,並使用要執行的開機指令碼更新 spec 欄位。

查看開機指令碼的輸出內容

  1. 按照步驟連線至 VM
  2. 在客層 VM 內執行下列指令,取得您執行的啟動指令碼記錄:

    sudo journalctl -u cloud-final
    

    開機指令碼記錄檔開頭如下:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...