ようへいの日々精進XP

よかろうもん

altria と LXC で cookbook のテスト環境(Odokumi)を作ってみた

概要

目的

  • サーバーで直接 cookbook のテストをしたい
  • 下記の通り、vagrant でも test-kitchen でもイケることをあえて別な方法でやってみる
  • 以前に考えていたことを実際に具現化

しかしながら

  • vagrantprovisioning コマンドで同じことをやれます
  • test-kitchen でも良いかと思います
  • ただ、メリットも無いわけではなく CI ツールを経由することで結果の履歴が追える(かもしれない)

本件について

  • このテスト環境を一つのフレームワークとしてそれらしい名前も考えてみた
  • テスト→テイスティング→お毒見→odokumi
  • ということで以後は Odokumi と呼ぶことになる。

Odokumi の構成とワークフロー

構成図

f:id:inokara:20130818030742p:plain

構成

コンポーネント 名前
OS Ubuntu 13.04(Ubuntu Server)
CI ツール altria
仮想環境 LXC

ワークフロー

  1. cookbook を修正
  2. git でローカルコミット
  3. hook スクリプトで Odokumi サーバーに cookbook を転送、転送が完了したら LXC コンテナを作成、作成された LXC コンテナに cookbook を転送
  4. 転送された cookbook を chef-solo を使って実行
  5. 結果を 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 の実行

お毒見中

altriaodokumi のビルドが走る。

f:id:inokara:20130818010236p:plain

殿、毒は盛られておりませぬ

cookbook が LXC コンテナに正常に適用される。

f:id:inokara:20130818010639p:plain

残念ながら毒が盛られていた場合

recipe 等にシンタックスエラーがあった場合には見事にコケる。

f:id:inokara:20130818012530p:plain

コケた場合には LXC コンテナの削除は行われず、ログインして詳細な調査が出来るようにしている。


ということで

odokumi 環境を構築していて気づいた点、改善点等。

altria と LXC について

altria について

  • ジョブ script へのスクリプトの貼り付け方を確認する(直接シェルスクリプトを貼り付けていいのか?)
  • redis-server が固まって、それに引きずられて altria 自身が固まってしまうことがあった

LXC について

  • lxc-info で存在しないコンテナ名を指定しても STOPPED 等と表示されてしまうので、lxc-info でコンテナの動作確認する場合には注意する

改善点

  • cookbook 以外にも ansible の playbooks や puppet の manifest もテスト出来るように
  • 対応する OS を増やして、test-kitchen のように複数の OS に対して一度にテスト出来るように