概要
目的
- サーバーで直接 cookbook のテストをしたい
- 下記の通り、
vagrantでもtest-kitchenでもイケることをあえて別な方法でやってみる - 以前に考えていたことを実際に具現化
しかしながら
vagrantのprovisioningコマンドで同じことをやれますtest-kitchenでも良いかと思います- ただ、メリットも無いわけではなく CI ツールを経由することで結果の履歴が追える(かもしれない)
本件について
- このテスト環境を一つのフレームワークとしてそれらしい名前も考えてみた
- テスト→テイスティング→お毒見→odokumi
- ということで以後は Odokumi と呼ぶことになる。
Odokumi の構成とワークフロー
構成図

構成
| コンポーネント | 名前 |
|---|---|
| OS | Ubuntu 13.04(Ubuntu Server) |
| CI ツール | altria |
| 仮想環境 | LXC |
ワークフロー
- cookbook を修正
- git でローカルコミット
- hook スクリプトで Odokumi サーバーに cookbook を転送、転送が完了したら LXC コンテナを作成、作成された LXC コンテナに cookbook を転送
- 転送された cookbook を
chef-soloを使って実行 - 結果を
altriaで捕捉する
構築や設定
すべてを書くとながーくなるのでポイントを幾つか。
altria 関連
altria を動作させるユーザーを作成
- altria を動作させる altria ユーザーを作成
- altria ユーザーで altria 自身をセットアップして起動させる
- 念の為、chef 環境をインストールしておく。(Opscode のインストーラーを使う)
altria から lxc-* コマンドを叩かせる
sudoers の設定を弄る。
ssh の設定も少し追加
コンテナへの接続の際に known_hosts への追加登録を確認されるステップをスキップする設定を /home/altria/.ssh/config に設定する。
LXC 関連
LXC コンテナへの仕込み
今回は Debian 6(squeeze) を環境として用意する。
そして、必要な apt パッケージを導入しておく。
その他、以下のような設定を行なっておく。
- altria ユーザーの鍵をテスト用の LXC コンテナ
rootユーザーのauthorized_keysに登録しておく - IP アドレスを決め打ちで設定しておく(
/etc/hostsとかに設定でも良いかも) - 当然、chef 環境をインストールしておく。(Opscode のインストーラーを使う)
仕込みをしておいたコンテナは lxc-clone でコンテナを複製する際のオリジナルコンテナとしておく。
使ってみる
cookbook 作成環境の準備
ワークステーション側で以下のようなディレクトリ構成の cookbook 作成環境を用意する。
$ tree git/chef/ -L 3
git/chef/
└── cookbooks
├── .git #=> 後述
├── chef.json #=> run_list を記載
└── test1 #=> Cookbook
├── CHANGELOG.md
├── README.md
├── attributes
├── definitions
├── files
├── libraries
├── metadata.rb
├── providers
├── recipes
├── resources
└── templates
10 directories, 4 files
ちょっと特殊な対応として run_list が記述された chef.json をテストを行う cookbook ごとに書き換える必要がある。また、それぞれの cookbook と同じディレクトリに設置しておく。(この辺りは要改善)
cookbook 作成環境 での git 関連の準備
git init
cookbooksディレクトリ以下でgit initを実行する。
hook script
git init を実行後、cookbooks/.git/hooks 以下のようなに post-commit を設置する。
altria にジョブを登録する
ジョブを新規登録して、以下のような内容のスクリプトを作成して適当なディレクトリ(/home/altria/bin/)に
テストしてみる
何もしない recipe を書いてテストを行なってみる。
レシピ
本当に何もしていない。
odokumi の開始
odokumi の実行は git commit コマンドで始める。
git commit -m "modified."
以下のようにローカルのリポジトリに対してコミットが走った後で cookbooks ディレクトリ全体が odokumi サーバーに転送され、altria にジョブのビルドが要求される。
test build
rsync done...
{"id":16,"status":null,"started_at":null,"finished_at":null,"job_id":1,"output":null,"created_at":"2013-08-18T00:35:15.398+09:00","updated_at":"2013-08-18T00:35:15.398+09:00","properties":{},"incremental_id":16}
cookbook request done...
[master 0018f64] modified
1 file changed, 1 insertion(+), 6 deletions(-)
odokumi の実行
お毒見中
altria で odokumi のビルドが走る。

殿、毒は盛られておりませぬ
cookbook が LXC コンテナに正常に適用される。

残念ながら毒が盛られていた場合
recipe 等にシンタックスエラーがあった場合には見事にコケる。

コケた場合には LXC コンテナの削除は行われず、ログインして詳細な調査が出来るようにしている。
ということで
odokumi 環境を構築していて気づいた点、改善点等。
altria と LXC について
altria について
- ジョブ script へのスクリプトの貼り付け方を確認する(直接シェルスクリプトを貼り付けていいのか?)
redis-serverが固まって、それに引きずられてaltria自身が固まってしまうことがあった
LXC について
lxc-infoで存在しないコンテナ名を指定してもSTOPPED等と表示されてしまうので、lxc-infoでコンテナの動作確認する場合には注意する
改善点
- cookbook 以外にも ansible の playbooks や puppet の manifest もテスト出来るように
- 対応する OS を増やして、test-kitchen のように複数の OS に対して一度にテスト出来るように