AWSのEC2の初期化には、cloud-initを使うことも多いと思いますが。
cloud-initの設定を修正する度に、
EC2のインスタンスを起動し直しているとお金も時間もかかってしまいます。

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

環境は以下の流れで作ります。

  • UbuntuServerのインストール
  • LXDのセットアップ
  • コンテナの起動
  • cloud-initによるコンテナの初期化

cloud-initについては、以下をご覧下さい。

Documentation | cloud-init
http://cloudinit.readthedocs.io/en/latest/

UbuntuServerのインストール

ubuntuのサイトからUbuntuServerをダウンロードしてインストールします。

Download Ubuntu Server | ubuntu.com
https://www.ubuntu.com/download/server

このエントリでは「Ubuntu Server 16.04.2 LTS」で環境を作りました。
インストール時のオプションはデフォルトで問題無いはずです。

インストール完了後、パッケージをupgradeしておきます。

$ sudo apt-get upgrade

LXDのセットアップ

次にLXDをセットアップします。
以下のコマンドでLXDをインストールします。

$ sudo apt-get install lxd

以下のコマンドでLXDを初期化します、
ウィザードが始まりますが、これもデフォルトで問題無いはずです。

$ sudo lxd init

コンテナの起動

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

$ lxc launch ubuntu:16.04 my-ubuntu

以下のコマンドで、起動状態を確認します。
「my-ubuntu」が「RUNNING」にになっているはずです。

$ lxc list

以下のコマンドで、コンテナでbashを実行します。

$ lxc exec my-ubuntu /bin/bash

確認が終わったら、コンテナを停止、終了しておきます。

$ lxc stop my-ubuntu
$ lxc delete my-ubuntu

cloud-initによるコンテナの初期化

次にcloud-initによる、コンテナの初期化を試してみます。
cloud-configのサンプルとして、以下のようなファイルを用意します。

sample-cloud-config.yml

#cloud-config

# users and groups
groups:
  - admin

users:
  - name: admin
    primary-group: admin

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

$ lxc init ubuntu:16.04 my-ubuntu
$ lxc config set my-ubuntu user.user-data - < sample-cloud-config.yml
$ lxc start my-ubuntu

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

$ lxc exec my-ubuntu /bin/bash
root@my-ubuntu:~# su admin
admin@my-ubuntu:/root$ id
uid=1000(admin) gid=115(admin) groups=115(admin)

adminユーザが作成されていない場合は、
コンテナ内からcloud-configのスクリプトが見えているか、ログにエラーが出ていないかを確認します。

コンテナ内からcloud-configのスクリプトの確認方法

root@my-ubuntu:~# curl --unix-socket /dev/lxd/sock http://169.254.169.254/1.0/config/user.user-data

cloud-initのログの確認方法

root@my-ubuntu:~# cat /var/log/cloud-init-output.log

このような手順であれば、
cloud-configの修正とコンテナ再作成を繰り返しても、
比較的時間をかけずに開発・検証を行うことが出来ます。

CentOS用の開発環境も、
cloud-initをインストールしてちょっと改造すればいけそうな気がします。

↓CentOS7用の改造もやってみました

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

参考サイト

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

LXDで作ったコンテナをcloud-initで初期化してみる | くろの雑記帳
http://kurochan-note.hatenablog.jp/entry/2016/04/05/210418