ブログ・ア・ラ・クレーム

技術的なメモとかライフログとか。

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