Cloud-init

提供: ArchWiki
2018年1月21日 (日) 21:14時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

Cloud-init はクラウドのインスタンスを最初に初期化するためのユーティリティからなるパッケージです。OpenStackAWS などのクラウドで起動するための 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.cfgunverified_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.servicecloud-init modules --mode=config を実行する。
  • cloud-final.servicecloud-init modules --mode=final を実行する。

Uplink Labs の EC2 イメージは上記の全てを有効にしています。もっともこのイメージは依存関係のせいでやりすぎになっているようですが。