Cloud-init
Cloud-init はクラウドのインスタンスを最初に初期化するためのユーティリティからなるパッケージです。OpenStack や AWS などのクラウドで起動するための Arch Linux イメージに入れる必要があります。
目次
インストール
公式リポジトリから cloud-initAUR をインストールします。
設定
クラウド用の 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
ファイルを置くと、配置した *.cfg
ファイルも読み込まれます。
デフォルトユーザーの設定
2016年2月現在、パッケージに付属しているデフォルトの /etc/cloud/cloud.cfg
は Arch 向けに修正されておらず、ディストリが Ubuntu になっています。そのため、編集が必須です。
/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/
から動的にロードされ、起動時に実行されます。独自のモジュールを定義して、毎回の起動時に例えば次のようなことをさせることもできます:
- ディスクをリサイズする
- パッケージをアップデートする
モジュールは動作確認済みのディストリを cloud-init に知らせます。たとえあなたが実行したいと指定しても、cloud.cfg
で設定したディストリが検証済みのディストリのリストに記載されてなければモジュールは動作しません。検証がない場合でもモジュールを Arch で動作させたい場合、モジュールを cloud.cfg
の unverified_modules:
セクションに追加してください。例:
unverified_modules: ['ssh-import-id']
Systemd との統合
cloud-init は4個の systemd サービスと1個の systemd ターゲットを提供します。サービスとターゲットは以下の順番で起動するように依存関係が構築されます:
cloud-init-local.service
。ファイルシステムが立ち上がっていることを要求するだけ。cloud-init init --local
を実行する。cloud-init.service
。ネットワークが起動することを要求する。cloud-init init
を実行する。cloud-config.target
。cloud-config の起動イベントに反応して cloud-config が利用できるようになったことを第三者に伝えます。cloud-config.service
。cloud-init modules --mode=config
を実行する。cloud-final.service
。cloud-init modules --mode=final
を実行する。
Uplink Labs の EC2 イメージは上記の全てを有効にしています。もっともこのイメージは依存関係のせいでやりすぎになっているようですが。