UbuntuServer上でのCentOS7用cloud-init設定ファイルの開発環境の作り方
以下のエントリの続きで、
今度は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/