ChefのcookbookでLXCのコンテナのパッケージや設定を管理する
みんな大好きコンテナ仮想化。LXC非常に便利です。
しかし込み入った環境を作る際、コンテナを作り直したりリストアしたい場合、パッケージ導入を繰り返すのはなかなかしんどいと思われます。
そこで、Chefのcookbookでコンテナに入れるパッケージや設定を管理しましょう。
環境
以下、さくらVPSの2GプランでUbuntu 12.04をインストールした環境で試しています。
また、基本的にVPSのインスタンス上で作業をすることを想定しています。
コンテナへのcookbookの流し込みは、knife-soloで行います。
手順
1. LXCとChef 、knife-solo のインストール
apt でLXCを、gem でknife-solo をそれぞれインストールしておいてください。
2. LXC コンテナ用の、ローカルDNS設定を用意
コンテナを作成するたびに、コンテナのIPを調べるのは面倒なので、コンテナ名でアクセスができるようdsnmasqの設定を変更しておきます。
参考: http://orangain.hatenablog.com/entry/multi-node-serves-using-lxc-on-sakura-vps
3. knife-solo が利用可能な、ベースとなるコンテナを作成
knife-solo では基本的にsshでcookbookを流し込むので、事前に鍵設定を入れておくと便利です。
ここでは、鍵設定や、knife-soloのセットアップに必要なwgetを入れたコンテナを事前に作り、以降それをcloneして使おうと思います。
(コンテナ外で) $ sudo lxc-create -n ubuntu-chef-base -t ubuntu $ sudo lxc-start -n ubuntu-chef-base -d $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/chef_key $ ssh ubuntu@ubuntu-chef-base.local.example.com (コンテナ内で) $ mkdir .ssh $ cat > .ssh/authorized_keys chef_key.pub を貼付けてCtrl-D $ chmod 600 .ssh/authorized_keys $ sudo apt-get install wget $ exit (コンテナ外で) $ sudo lxc-shutdown -n ubuntu-chef-base
4. ベースコンテナからclone してknife-solo を準備する
cookbookを流し込むコンテナをcloneし起動、chef-soloを実行出来るようprepareします。
$ sudo lxc-clone -o ubuntu-chef-base -n test $ sudo lxc-start -n test -d $ knife solo prepare ubuntu@test.local.example.com
5. Chef リポジトリを作成
手元にChefリポジトリを作ります。基本的にこのリポジトリ以下にcookbookを配置することになります。
$ knife solo init <リポジトリ名>
knife.rb (knifeの設定ファイル)に、cookbook_path などの記述が無ければ追記します。
$ vim ~/.chef/knife.rb 以下の記述がなかったら追記する。 role_path '/path/to/chef-repo/roles' cookbook_path '/path/to/chef-repo/cookbooks' data_bag_path '/path/to/chef-repo/data_bags'
6. cookbook を用意
コンテナに流し込むcookbookを用意しましょう。
サードパーティ製 cookbook を持ってくる場合
例えば、opscode の提供するnginxのcookbookを持ってくる場合は以下のようにします
$ knife cookbook site vendor nginx
自分で cookbook を用意する場合
以下のようにして、新規にcookbook を作成します
$ knife cookbook create <cookbook名>
あるいは、既に作成した cookbook を chef-repo/cookbooks/ 以下に配置しましょう。
7. cookbook をコンテナに送り、実行させる
実行するrecipeを、nodes/ 以下のrun_listか、knife solo cook のoオプションで指定します。 以下はnginxのrecipeを実行する場合。
$ knife solo cook -i ~/.ssh/chef_key -o "recipe[nginx]" ubuntu@test.local.example.com
雑感
LXC、Chef周辺は補助的なツールが多くて、どういった構成が良いのかなかなか悩みます。
dockerとか、Berkshelf とか使うともっと楽になるのかしら。
本記事は以下の記事を参考に、手順をまとめました。: http://inokara.hateblo.jp/entry/2013/04/01/005519