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

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

始める前に

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

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

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

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

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

権限とアクセス権をリクエストする

このページに記載されているタスクを行うには、プロジェクトの VirtualMachine 管理者ロールが必要です。アクセスを確認するか、VM が存在するプロジェクトの Namespace でプロジェクト IAM 管理者にプロジェクト VirtualMachine 管理者(project-vm-admin)ロールを割り当ててもらう手順に沿って操作します。

起動スクリプトを渡す

起動スクリプトとして 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 specscriptSecretRef の名前が 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 シークレットの両方を含む起動スクリプトを定義します。

    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 \
        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 を作成する 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> ...