2.9. ブート時のインスタンスの設定

概要

起動後にインスタンスの設定を行うことがよくあります。例えば、Puppet または Chef サーバーを使用して、パッケージのインストール、サービスの開始、インスタンスの管理を行う場合などです。OpenStack クラウドでインスタンスを起動する場合には、ユーザーデータと cloud-init という 2 つのテクノロジーがあり、それらが連携して起動時のインスタンスの自動設定をサポートします。

ユーザーデータ

ユーザーデータは、ローカルファイルに含まれている情報を起動時にインスタンスに渡す仕組みのことです。典型的なユースケースとして、ユーザーデータとしてシェルスクリプトや設定ファイルを指定することなどが挙げられます。
ユーザーデータは、nova boot が呼び出されると --user-data /path/to/filename オプションを使用して送信します。以下の例では、テキストファイルを作成し、ユーザーデータとしてそのファイルの内容をインスタンスに送信しています。
$ echo "This is some text" > myfile.txt
$ nova boot --user-data ./myfile.txt --image myimage myinstance
インスタンスは、OpenStack メタデータ API または EC2 互換の API のいずれかで問い合わせして、ユーザーデータを取得します。
$ curl http://169.254.169.254/2009-04-04/user-data
This is some text
$ curl http://169.254.169.254/openstack/2012-08-10/user_data
This is some text
Compute Service はユーザーデータを blob として処理する点に注意してください。上記の例ではテキストファイルを使用していますが、ユーザーデータはどのような形式でも構いません。

CloudInit

ユーザーデータを有効に使用するには、起動時にメタデータサービスからユーザーデータを取得して、そのデータの内容を元にアクションを起こすサービスが実行されるように、仮想マシンのイメージを設定する必要があります。cloud-init パッケージは、このために設計されています。特に、cloud-init は、Compute メタデータサービスと Compute コンフィグドライブと互換性があります。
cloud-init は OpenStack のテクノロジーではない点にご注意ください。OpenStack のテクノロジーではなく、同じ仮想マシンイメージを修正なしに他のクラウドで使用できるように、複数のクラウドプロバイダーをサポートするために設計されたパッケージです。CloudInit はオープンソースのプロジェクトで、ソースコードは Launchpad から入手できます。
作成したイメージに cloud-init をインストールして、起動時のインスタンスの設定タスクを簡素化するように推奨しています。ユーザーデータを使用せずに起動時のインスタンスの動作を設定する場合でも、cloud-init は公開鍵のアカウントへのコピーなど便利な機能を提供します。
cloud-init をインストールしていない場合、イメージを手動で設定して起動時にメタデータサービスから公開鍵を取得し適切なアカウントにコピーする必要があります。

CloudInit 対応の形式とドキュメント

cloud-init の使用方法の詳細については、cloud-init doc/userdata.txt ファイル、examples ディレクトリに目を通すように推奨しています。基本的な例がここで提供しています。
CloudInit は、様々なユーザーデータの入力形式に対応しています。ここでは、一般的によく使用される形式を 2 種類紹介します。
  • シェルスクリプト (#! で始まるもの)
  • Cloud 設定ファイル (#cloud-config で始まるもの)

起動時のシェルスクリプトの実行

cloud-init がインストールされている前提で、最も簡単に、起動時にインスタンスを設定する方法は、ユーザーデータをシェルスクリプトとして指定することです。シェルファイルは、cloud-init によりシェルスクリプトとして認識されるように #! で開始する必要があります。以下は、clouduser と呼ばれるアカウントを作成するスクリプトの例です。
#!/bin/bash
adduser --disabled-password --gecos "" clouduser
ユーザーデータとしてシェルスクリプトを送信するのは、/etc/rc.local スクリプトを記述するのとよく似た効果があります。root のブートシーケンスの最後のほうで実行されます。

Cloud-config の形式

CloudInit は、システムで多数のオプションを設定可能な YAML ベースの設定形式をサポートしています。#cloud-config で始まるユーザーデータは、cloud-init により cloud-config 形式として解釈されます。

例: ホスト名の設定

以下の cloud-init ユーザーデータの例は、ホスト名と完全修飾ドメイン名を設定して、インスタンスの /etc/hosts を更新します。
#cloud-config
hostname: mynode
fqdn: mynode.example.com
manage_etc_hosts: true

例: Puppet でのインスタンス設定

以下の cloud-init のユーザーデータの例は、doc/examples/cloud-config-puppet.txt をベースにしており、puppetmaster.example.org にある Puppet サーバーに問い合わせして、証明書でアイデンティティーの検証を行うように設定します。
#cloud-config
puppet:
 conf:
   agent:
     server: "puppetmaster.example.org"
   ca_cert: |
     -----BEGIN CERTIFICATE-----
     MIICCTCCAXKgAwIBAgIBATANBgkqhkiG9w0BAQUFADANMQswCQYDVQQDDAJjYTAe
     Fw0xMDAyMTUxNzI5MjFaFw0xNTAyMTQxNzI5MjFaMA0xCzAJBgNVBAMMAmNhMIGf
     MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCu7Q40sm47/E1Pf+r8AYb/V/FWGPgc
     b014OmNoX7dgCxTDvps/h8Vw555PdAFsW5+QhsGr31IJNI3kSYprFQcYf7A8tNWu
     1MASW2CfaEiOEi9F1R3R4Qlz4ix+iNoHiUDTjazw/tZwEdxaQXQVLwgTGRwVa+aA
     qbutJKi93MILLwIDAQABo3kwdzA4BglghkgBhvhCAQ0EKxYpUHVwcGV0IFJ1Ynkv
     T3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwDwYDVR0TAQH/BAUwAwEB/zAd
     BgNVHQ4EFgQUu4+jHB+GYE5Vxo+ol1OAhevspjAwCwYDVR0PBAQDAgEGMA0GCSqG
     SIb3DQEBBQUAA4GBAH/rxlUIjwNb3n7TXJcDJ6MMHUlwjr03BDJXKb34Ulndkpaf
     +GAlzPXWa7bO908M9I8RnPfvtKnteLbvgTK+h+zX1XCty+S2EQWk29i2AdoqOTxb
     hppiGMp0tT5Havu4aceCXiy2crVcudj3NFciy8X66SoECemW9UYDCb9T5D0d
     -----END CERTIFICATE-----