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.vendor-dataまたはuser.vendor-data(Vendor dataを参照)cloud-init.user-dataまたはuser.user-data(User data formatsを参照)cloud-init.network-configまたはuser.network-config(Network configurationを参照)
設定オプションの詳細については、cloud-initインスタンスオプションと、cloud-initドキュメント内のLXDデータソースを参照してください。
ベンダーデータとユーザーデータ#
vendor-dataとuser-dataの両方が、cloud-initにクラウド構成データを提供するために使用されます。
主な考え方は、vendor-dataは一般的なデフォルト構成に使用され、user-dataはインスタンス固有の構成に使用されることです。
これは、プロファイルでvendor-dataを指定し、インスタンス構成でuser-dataを指定する必要があることを意味します。
LXDはこの方法を強制しませんが、プロファイルとインスタンス構成の両方でvendor-dataとuser-dataを使用することができます。
インスタンスに対してvendor-dataとuser-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-dataとvendor-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リリースに応じてifupdownかnetplanを使用して、システム上の関連するネットワーク構成をレンダリングします。
構成データは、インスタンスのルートファイルシステム内の以下のファイルに保存されます:
/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