Cloud-init
Cloud-init はクラウドのインスタンスを最初に初期化するためのユーティリティからなるパッケージです。 OpenStack や AWS などのクラウドで起動するための Arch Linux イメージに入れる必要があります。
目次
インストール
公式リポジトリ から cloud-init をインストールします。
設定
クラウド用の Arch のイメージを準備するためには、いくつかのステップが必要になります:
- デフォルトユーザーを作成する。このユーザーでインスタンスにログインすることになります。ここでは
arch
というユーザーを作成します。 - sudo をインストールし、デフォルトユーザーを sudo グループに追加します。これでスーパーユーザーとしてコマンドを実行できるようになります。
- デフォルトユーザーがパスワードなしで sudo できるようにします。
- インスタンスのメタ情報を引き出せるように cloud-init を設定します。以下のことが含まれますが、これだけに限られるわけではありません:
hostname
をセットするresolv.conf
をセットする- デフォルトユーザーの
~/.ssh/authorized_keys
をセットする
cloud-init のメイン設定ファイルは /etc/cloud/cloud.cfg
です。/etc/cloud/cloud.cfg.d
に *.cfg
ファイルを 置くと、これらも読み込まれます。
デフォルトユーザーの設定
/etc/cloud/cloud.cfg
を編集して以下のようにします:
users: - default
これによって system_info
> default_user
のユーザーがデフォルトユーザーになります。
system_info: distro: arch default_user: name: arch lock_passwd: True gecos: Arch groups: [adm, audio, cdrom, dialout, dip, floppy, netdev, plugdev, sudo, video] sudo: ["ALL=(ALL) NOPASSWD:ALL"] shell: /bin/bash
system_info
の中でディストロを "arch" と指定しています。これによって設定に arch.py
が使われるようになります。さらに以下の設定をしています:
- デフォルトユーザーの名前を
arch
にする - デフォルトユーザーのパスワードをロックする。これによって起動時に設定した SSH 鍵なしにログインできなくなる。
- デフォルトユーザーをグループ
adm
,audio
,cdrom
,dialout
,dip
,floppy
,netdev
,plugdev
,sudo
,video
に追加する - デフォルトユーザーをパスワードなしで sudo できるようにする
- デフォルトユーザーのシェルを
/bin/bash
にする
root でのログインを禁止する
/etc/cloud/cloud.cfg
で次のように指定します:
disable_root: true
また、root ユーザーのパスワードを削除することもできます:
# passwd -d root
前のセクションでの設定が正しく動作することを確認できていない限り、これは実行しないでください。そうしないとインスタンスから完全に閉めだされてしまいます。
データソースの設定
データソースは、起動時にどのようにインスタンスのメタ情報を引き出すかを定義します。
これはどのクラウド(OpenStack, AWS, OpenNebula など)を使うかによります。
内部では、これは共通のインターフェイスで定義されたいくつかのメソッドを実装しているモジュールに対応します。
/etc/cloud/cloud.cfg
を編集して以下のようにしてください:
datasource_list: [ NoCloud, ConfigDrive, OpenNebula, Azure, AltCloud, OVF, MAAS, GCE, OpenStack, CloudSigma, Ec2, CloudStack, None ]
これによって、インスタンスのメタ情報をダウンロードするときにどのモジュールを使うかを指定します。 状況に応じて、以下のように各データソースごとのパラメータを渡すこともできます:
datasource: OpenStack: metadata_urls: [ 'http://169.254.169.254:80' ] dsmode: net
上記の設定は、OpenStack データソースの場合に http://169.254.169.254:80
からメタデータをダウンロードするようにし、ネットワーク初期化の後に実行させるようにします。これはどちらもデフォルトの挙動であり、省略できます。
cloud.cfg の他のセクション
cloud.cfg
には他にもいくつかのセクションがあり、 cloud_init_modules
, cloud_config_modules
, cloud_final_modules
などを含んでいます。これらはインスタンス初期化の各ステージにおいて実行されるモジュールを定義しています。
これらのモジュールは /usr/lib/python2.7/site-packages/cloudinit/config/
から動的にロードされ、起動時に実行されます。
独自のモジュールを定義して、毎回の起動時に例えば次のようなことをさせることもできます:
- ディスクをリサイズする
- パッケージをアップデートする
Systemd との統合
cloud-init は4個の systemd サービスと1個の systemd ターゲットを提供します。 これらが以下の順番で起動するように依存関係が構築されます:
cloud-init-local.service
。ファイルシステムが立ち上がっていることを要求するだけ。cloud-init init --local
を実行する。cloud-init.service
。ネットワークが起動することを要求する。cloud-init init
を実行する。cloud-config.target
。Corresponds to the cloud-config upstart event "to inform third parties that cloud-config is available"cloud-config.service
.cloud-init modules --mode=config
を実行する。cloud-final.service
.cloud-init modules --mode=final
を実行する。
Uplink Labs EC2 images は上記の全てを有効にしています。もっともこれは依存関係のせいでやりすぎになっているようですが。