cloud-initを使用するには

cloud-initは Linux ディストリビューションのインスタンスの自動的な初期化とカスタマイズのためのツールです。

インスタンスにcloud-init設定を追加することで、インスタンスの最初の起動時にcloud-initに特定のアクションを実行させることができます。 可能なアクションには、たとえば以下のようなものがあります:

  • パッケージの更新とインストール

  • 特定の設定の適用

  • ユーザーの追加

  • サービスの有効化

  • コマンドやスクリプトの実行

  • 仮想マシンのファイルシステムをディスクのサイズに自動的に拡張する

詳細な情報はCloud-init documentationを参照してください。

注釈

cloud-initアクションはインスタンスの最初の起動時に一度だけ実行されます。 インスタンスの再起動ではアクションは再実行されません。

イメージ内のcloud-initサポート

cloud-initを使用するには、cloud-initがインストールされたイメージをベースにインスタンスを作る必要があります。

imagesリモートからのイメージにはcloud-initが有効化されたバリアントがあり、通常デフォルトバリアントよりもサイズが大きくなります。 クラウドバリアントは/cloud接尾辞を使用します。たとえば、images:ubuntu/22.04/cloud

cloud-initと仮想マシン

cloud-initを仮想マシン内で動かすには、VM内でincus-agentを動かすか、特別な追加ディスク経由でcloud-initのデータを提供する必要があります。 images:リモートで提供されるすべてのイメージはagentが設定済みですので、そのままで大丈夫です。

incus-agentを持たないインスタンスでは、追加のcloud-initディスクを以下のように渡せます:

incus config device add INSTANCE cloud-init disk source=cloud-init:config

設定オプション

Incus は、cloud-initの設定に対してcloud-init.*user.*の 2 つの異なる設定オプションセットをサポートしています。 どちらのセットを使用する必要があるかは、使用するイメージのcloud-initサポートによって異なります。 一般的には、新しいイメージはcloud-init.*設定オプションをサポートし、古いイメージはuser.*をサポートしていますが、例外も存在する可能性があります。

以下の設定オプションがサポートされています。

設定オプションの詳細については、cloud-initインスタンスオプションと、cloud-initドキュメント内のLXD データソースを参照してください。

ベンダーデータとユーザーデータ

vendor-datauser-dataの両方が、cloud-initクラウド構成データを提供するために使用されます。

主な考え方は、vendor-dataは一般的なデフォルト構成に使用され、user-dataはインスタンス固有の構成に使用されることです。 これは、プロファイルでvendor-dataを指定し、インスタンス構成でuser-dataを指定する必要があることを意味します。 Incus はこの方法を強制しませんが、プロファイルとインスタンス構成の両方でvendor-datauser-dataを使用することができます。

インスタンスに対してvendor-datauser-dataの両方が提供される場合、cloud-initは 2 つの構成をマージします。 しかし、両方の設定で同じキーを使った場合、マージは不可能になるかもしれません。 この場合、指定されたデータをどのようにマージするべきかをclout-initに指定してください。 Merging user data sectionsを参照して手順を確認してください。

cloud-initの設定方法

インスタンスのcloud-initを設定するには、対応する設定オプションをインスタンスが使用するプロファイルまたはインスタンス構成に直接追加します。

インスタンスに直接cloud-initを設定する場合、cloud-initはインスタンスの最初の起動時にのみ実行されることに注意してください。 つまり、インスタンスを起動する前にcloud-initを設定する必要があります。 これを行うには、incus launchの代わりにincus initでインスタンスを作成し、設定が完了した後に起動します。

cloud-init設定のYAMLフォーマット

cloud-initのオプションでは、YAML のliteralスタイルフォーマットが必要です。 パイプ記号(|)を使用して、パイプの後にインデントされたテキスト全体を、改行とインデントを保持したままcloud-initに単一の文字列として渡すことを示します。

vendor-dataおよびuser-dataのオプションは通常、#cloud-configで始まります。

例:

config:
  cloud-init.user-data: |
    #cloud-config
    package_upgrade: true
    packages:
      - package1
      - package2

Tip

構文が正しいかどうかを確認する方法については、How to validate user dataを参照してください。

cloud-initのステータスを確認する方法

cloud-initはインスタンスの最初の起動時に自動的に実行されます。 設定されたアクションによっては、完了するまでに時間がかかる場合があります。

cloud-initのステータスを確認するには、インスタンスにログインして以下のコマンドを入力します。

cloud-init status

結果がstatus: runningの場合、cloud-initはまだ実行中です。結果がstatus: doneの場合、完了しています。

また、--waitフラグを使用して、cloud-initが完了したときにのみ通知を受け取ることができます:

root@instance:~# cloud-init status --wait
.....................................status: done

ユーザーデータやベンダーデータを指定する方法

user-datavendor-dataの設定は、たとえば、パッケージのアップグレードやインストール、ユーザーの追加、コマンドの実行などに使用することができます。

提供される値は、最初の行でcloud-initに渡されるユーザーデータ形式のタイプを示す必要があります。 パッケージのアップグレードやユーザーの設定などのアクティビティには、#cloud-configが使用するデータ形式です。

構成データは、インスタンスのルートファイルシステム内の以下のファイルに保存されます:

  • /var/lib/cloud/instance/cloud-config.txt

  • /var/lib/cloud/instance/user-data.txt

以下のセクションでは、さまざまな例のユースケースに対するユーザーデータ(またはベンダーデータ)の設定を参照してください。

より高度なは、cloud-initドキュメントで見つけることができます。

パッケージのアップグレード

インスタンスが作成された直後に、インスタンスのリポジトリからパッケージをアップグレードするためには、package_upgradeキーを使用します:

config:
  cloud-init.user-data: |
    #cloud-config
    package_upgrade: true

パッケージのインストール

インスタンスのセットアップ時に特定のパッケージをインストールするには、packagesキーを使用し、パッケージ名をリストとして指定します:

config:
  cloud-init.user-data: |
    #cloud-config
    packages:
      - git
      - openssh-server

タイムゾーンの設定

インスタンス作成時にインスタンスのタイムゾーンを設定するには、timezoneキーを使用します:

config:
  cloud-init.user-data: |
    #cloud-config
    timezone: Europe/Rome

コマンドの実行

コマンド(マーカーファイルの書き込みなど)を実行するには、runcmdキーを使用し、コマンドをリストとして指定します:

config:
  cloud-init.user-data: |
    #cloud-config
    runcmd:
      - [touch, /run/cloud.init.ran]

ユーザーアカウントの追加

ユーザーアカウントを追加するには、userキーを使用します。 デフォルトユーザーやサポートされているキーに関する詳細は、cloud-initドキュメント内のIncluding users and groupsの例を参照してください。

config:
  cloud-init.user-data: |
    #cloud-config
    user:
      - name: documentation_example

ネットワーク構成データを指定する方法

デフォルトでは、cloud-initはインスタンスのeth0インターフェースに DHCP クライアントを設定します。 デフォルトの構成を上書きするために、network-configオプションを使用して独自のネットワーク構成を定義することができます(これはテンプレートの構造によるものです)。

その後、cloud-initは Ubuntu リリースに応じてifupdownnetplanを使用して、システム上の関連するネットワーク構成をレンダリングします。

構成データは、インスタンスのルートファイルシステム内の以下のファイルに保存されます:

  • /var/lib/cloud/seed/nocloud-net/network-config

  • /etc/network/interfaces.d/50-cloud-init.cfgifupdownを使用している場合)

  • /etc/netplan/50-cloud-init.yamlnetplanを使用している場合)

特定のネットワークインターフェースに静的な IPv4 アドレスを設定し、カスタム名前サーバーを使用するための次の設定を使用します:

config:
  cloud-init.network-config: |
    version: 2
    ethernets:
      eth1:
        addresses:
          - 10.10.101.20/24
        gateway4: 10.10.101.1
        nameservers:
          addresses:
            - 10.10.10.254