概要
目的
- サーバーで直接 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 に対して一度にテスト出来るように