cloud-initを使用するには#

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

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

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

  • 特定の設定の適用

  • ユーザーの追加

  • サービスの有効化

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

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

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

注釈

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

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

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

  • ubuntuおよびubuntu-daily イメージサーバーからのすべてのイメージはcloud-initをサポートしています。

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

設定オプション#

LXDは、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を指定する必要があることを意味します。 LXDはこの方法を強制しませんが、プロファイルとインスタンス構成の両方で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を設定する必要があります。 これを行うには、lxc launchの代わりにlxc 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 debug 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.cfg (ifupdownを使用している場合)

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

#

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

config:
  cloud-init.network-config: |
    version: 1
    config:
      - type: physical
        name: eth1
        subnets:
          - type: static
            ipv4: true
            address: 10.10.101.20
            netmask: 255.255.255.0
            gateway: 10.10.101.1
            control: auto
      - type: nameserver
        address: 10.10.10.254