Linux VM の VM インスタンスで起動スクリプトを使用する

起動スクリプトは、仮想マシン(VM)の起動プロセス中にタスクを実行します。このページでは、VM インスタンスで起動スクリプトを使用する手順について説明します。

始める前に

gdcloud コマンドライン インターフェース(CLI)コマンドを使用するには、gdcloud CLI をダウンロード、インストール、 構成していることを確認してください。GDC エアーギャップ アプライアンスのすべてのコマンドは、gdcloud または kubectl CLI を使用し、オペレーティング システム(OS)環境が必要です。

kubeconfig ファイルのパスを取得する

Management API サーバーに対してコマンドを実行するには、次のリソースがあることを確認してください。

  1. Management API サーバー名を確認するか、プラットフォーム管理者(PA)にサーバー名を確認します。

  2. Management API サーバーの kubeconfig ファイルがない場合は、ログインして生成します。

  3. この手順では、パスを使用して MANAGEMENT_API_SERVER{"</var>"}} を置き換えます。

IAM ロールをリクエストする

VM に起動スクリプトを使用するには、プロジェクト IAM 管理者に連絡して、プロジェクトに対する次のロールをリクエストします。

  • プロジェクト VirtualMachine 管理者 (project-vm-admin): プロジェクト Namespace 内の VM を作成、変更、一覧表示、削除します。

  • Secret 管理者 (secret-admin): プロジェクト Namespace 内の Kubernetes Secret の取得、一覧表示、作成、更新、削除、パッチ適用、監視を行います。このロールを使用して、起動スクリプトの Secret を指定します。プレーン テキストの起動スクリプトを指定する場合、このロールは必要ありません。

すべての VM ロールは、VM が存在するプロジェクトの Namespace にバインドする必要があります。 手順に沿ってアクセス権 を確認します。

起動スクリプトを渡す

起動スクリプトとして bash スクリプトまたは bash 以外のスクリプトを使用できます。これを行うには、スクリプトの先頭に #!/bin/… を追加して、スクリプト インタープリタを指定します。 たとえば、Python 3 の起動スクリプトを使用する場合は、スクリプトの先頭に #! /usr/bin/python3 を追加します。

Google Distributed Cloud(GDC)エアーギャップ アプライアンスは、各起動スクリプトの名前に基づいて、起動スクリプトをアルファベット順に実行します。

次の表に、スクリプトのサイズに基づいて使用するスクリプト形式を示します。

スクリプト サイズ スクリプト形式
2,048 バイトまでのスクリプト クリアテキスト
2,048 バイトを超えるスクリプト Kubernetes Secret

起動スクリプトを定義する

起動スクリプトを使用するには、VM の spec フィールドに startupScripts フィールドを追加する必要があります。このフィールド内で、複数の起動スクリプトをクリアテキストまたは Kubernetes Secret として指定できます。

次の例では、起動スクリプトをクリアテキストと Kubernetes Secret として指定します。

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==

次の考慮事項を確認してください。

  • 起動スクリプトは起動するたびに実行されます。
  • 起動スクリプトにはデフォルトの root 権限があります。
  • Kubernetes Secret では、VM の spec の scriptSecretRef の名前が metadata.name フィールドと一致する必要があります。
  • Kubernetes Secret で、data フィールドにキー script を追加して、起動スクリプトの内容を指定します。

起動スクリプトを使用して新しい VM を作成する

これらの手順は、VM の作成に使用するイメージに関係なく適用されます。次の手順に沿って操作します。

  1. 起動スクリプトを Kubernetes Secret として作成するには、次を実行します。

    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 を作成する手順を参照します。 ステップ 1 で、VM を作成するコマンドを 実行する前に、起動スクリプトを spec フィールドに追加します。

    この例では、クリアテキストと Kubernetes Secret の両方を使用して起動スクリプトを定義します。

    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 Management 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 Secret としての起動スクリプトの名前。
  3. 次の手順に沿って VM を作成します。

    次の例は、Kubernetes Secret とクリアテキストを使用して新しいユーザーを追加する起動スクリプトで VM を作成する方法を示しています。

    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 Management 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 フィールドを更新します。

起動スクリプトの出力を表示する

  1. 手順に沿って VM に接続します。
  2. ゲスト VM 内で次のコマンドを実行して、実行した起動スクリプトのログを取得します。

    sudo journalctl -u cloud-final
    

    起動スクリプトのログは次のように始まります。

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