以下のエントリの続きで、
今度はCentOS7用にcloud-init設定ファイルの開発環境を作ります(前回はUbuntu)。

UbuntuServerでcloud-initの設定ファイルを開発する環境の作り方 | takemikami's note
http://takemikami.com/2017/06/07/UbuntuServercloudinit.html

このエントリでは、UbuntuServerにLXDを設定して、
CentOSのイメージにcloud-initの設定を開発・動作確認するための環境を作ります。

無理矢理な方法で動かすので、間違っても本番環境に乗せないでください。

環境構築は以下の流れで行います(LXDのセットアップは完了している前提です)。

  • CentOS7コンテナの起動
  • cloud-initのインストール
  • LXD上でcloud-initを動かすための改造
  • 作成したコンテナのイメージ保存
  • cloud-initの動作確認
  • イメージのエクスポート

CentOS7コンテナの起動

以下のコマンドでCentOS7の(イメージをダウンロードして)コンテナを起動します。
「images:centos/7/amd64」のイメージを「my-centos」と言う名称で起動しています。

$ lxc launch images:centos/7/amd64 my-centos

CentOS7へのcloud-initのインストール

以下のコマンドでCentOSのコンテナに接続し、cloud-initをインストールします。

$ lxc exec my-centos /bin/bash
[root@my-centos ~]# yum install cloud-init

LXD上でcloud-initを動かすための改造

cloud-initのソースを「NoCloud」にしたいので、以下のファイルに設定を追加します。

/etc/cloud/cloud.cfg.d/90_dpkg.cfg

# to update this file, run dpkg-reconfigure cloud-init
datasource_list: [ NoCloud, None ]

NoCloudをソースにすると「/var/lib/cloud/seed/nocloud-net/」を見に行くようなので、
「clout-init」のスクリプトにLXDのmeta-data, user-dataを保存するために以下のコードを追加します。
「import os」とかが並んでいる後くらいに書いておけば動くと思います。

/usr/bin/cloud-init に追記

os.system("mkdir -p /var/lib/cloud/seed/nocloud-net")
os.system("curl --unix-socket /dev/lxd/sock http://169.254.169.254/1.0/meta-data > /var/lib/cloud/seed/nocloud-net/meta-data")
os.system("curl --unix-socket /dev/lxd/sock http://169.254.169.254/1.0/config/user.user-data > /var/lib/cloud/seed/nocloud-net/user-data")
os.system("head -1 /var/lib/cloud/seed/nocloud-net/user-data | grep '^#' || rm -f /var/lib/cloud/seed/nocloud-net/user-data")

hostnameの設定時に、インスタンスIDとかを引きにいって失敗してしまうようなので、
cloud-initの設定から「set_hostname」を削除しておきます。

/etc/cloud/cloud.cfg から削除

 - set_hostname

作成したコンテナのイメージ保存

前項までの改造を行ったら、コンテナを停止します。

$ lxc stop my-centos

コンテナを停止後、コンテナをイメージとして保存します。

$ lxc publish my-centos --alias centos7/cloud-init

以下のコマンドでイメージが保存されていることを確認します。

$ lxc image list

cloud-initの動作確認

次にcloud-initによる、コンテナの初期化を試してみます。

Ubuntuの時と同様に、 cloud-configのサンプルとして、以下のようなファイルを用意します。

sample-cloud-config.yml

#cloud-config

# users and groups
groups:
  - admin

users:
  - name: admin
    primary-group: admin

以下のコマンドで、コンテナの初期化・user-dataの設定・開始を行います。

$ lxc init centos7/cloud-init my-centos2
$ lxc config set my-centos2 user.user-data - < sample-cloud-config.yml
$ lxc start my-centos2

以下のコマンドで、コンテナに接続してadminユーザが作成されていることを確認します。

$ lxc exec my-centos2 /bin/bash
[root@my-centos2 ~]# su admin
[admin@my-centos2 root]$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin)

上手く行かない場合は「/var/log/cloud-init-output.log」を確認します。

イメージのエクスポート

最後に、以下のコマンドで作成したイメージをエクスポートしておきます。
FINGERPRINTに従った名前のtar.gzファイルが出力されます。

$ lxc image export centos7/cloud-init .

ちなみにインポートしたい場合は、以下のコマンドでインポート出来ます。

$ lxc image import [ファイル名]

とりあえず、以上の手順でcentos7用にcloud-initの設定を開発する環境が準備出来ました。
無理矢理動かしたので、何か問題が起きそうな気はしますが。

参考サイト

このエントリをまとめるにあたって、以下のサイトを参考にしました。

LXD 2.0: イメージの管理 [5/12] | Qiita
http://qiita.com/m-shibata/items/606f7465d83f296ceea0

Image server for LXC and LXD | Linux Containers - Image server https://us.images.linuxcontainers.org/