在 Linux VM 中使用開機指令碼

開機指令碼會在虛擬機器 (VM) 的啟動程序中執行工作。本頁面提供逐步說明,引導您在 Linux VM 執行個體上使用啟動指令碼。

事前準備

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

取得 kubeconfig 檔案路徑

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

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

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

要求權限和存取權

如要執行本頁列出的工作,您必須具備專案虛擬機器管理員角色。請按照步驟驗證存取權,或請專案 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 的 Distributed Cloud 專案。
    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 密鑰,新增 Linux 使用者,以及以純文字形式新增開機指令碼,將同一位使用者新增至 Ubuntu 中的 sudoers 群組。

    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-linux-user
        scriptSecretRef:
          name: add-user
      - name: add-to-linux-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
      EOF
    

    在範例中,變數定義如下。

    變數定義
    MANAGEMENT_API_SERVER 管理 API 伺服器 kubeconfig 檔案。
    PROJECT 要在其中建立 VM 的 Distributed Cloud 專案。
    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> ...