Linux VM で起動スクリプトを使用する

このドキュメントでは、起動スクリプトを使用して、Google Distributed Cloud(GDC)エアギャップで仮想マシン(VM)インスタンスとそれに関連するプログラムを起動する方法について説明します。

起動スクリプトは、VM の起動プロセス中にタスクを実行する自動化ツールです。起動スクリプトを使用して、新規または既存のインスタンスで VM の構成タスクとデプロイタスクを自動化することで、時間を節約し、手動構成の手間を軽減します。

このドキュメントは、Distributed Cloud 環境で VM の起動スクリプトを使用するプラットフォーム管理者またはアプリケーション オペレーター グループの開発者を対象としています。詳細については、GDC エアギャップ ドキュメントの対象読者をご覧ください。

始める前に

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

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

Management API サーバーに対してコマンドを実行するには、次のリソースが必要です。

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

  2. これらの手順では、MANAGEMENT_API_SERVER を Management API サーバーの kubeconfig ファイルのパスに置き換えます。

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

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

  • 仮想マシン プロジェクト管理者(project-vm-admin): プロジェクトの名前空間で VM を作成、変更、一覧表示、削除します。

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

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

起動スクリプトを渡す

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

Google Distributed Cloud(GDC)エアギャップは、startupScripts 配列に表示される順序で起動スクリプトを実行します。

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

スクリプトのサイズ スクリプトの形式
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 \
      -n PROJECT \
      create secret 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 を作成する 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 Secret としての起動スクリプトの名前。
  3. 次の手順で VM を作成します。

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

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -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 を作成する Distributed Cloud プロジェクト。
    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> ...