Kitchen を使う準備
Kitchen とは
Vagrant、EC2、Docker Engine など、任意のインスタンスを立てて、その中で Cookbook の動作を試行できるツールです。
http://kitchen.ci/
今回は高速・軽量な Docker Engine のインスタンスで Cookbook の動作チェックをしていきます。
Docker Engine は Linux でのコンテナ型の仮想化を提供するツールです。
ハイパーバイザ型がマシンそのものをエミュレートするのに対し、コンテナ型の仮想化ではホストマシンのカーネル上に独立したユーザー空間を構築するのにとどまります。
ハイパーバーザ型と比較すると、コンテナ型の仮想化はホストのもつリソースをほぼそのまま扱えるため、より軽量・高速に仮想化を実現できます。
また、Docker Engine ではコンテナの差分管理が可能です。
たとえば、いちど CentOS をインストールしたコンテナをつくってしまえば、CentOS + apache や CentOS + MySQL などのコンテナを構築するときに毎回 CentOS をインストールする必要はありません。
Kitchen で Docker Engine を利用するには、kitchen-docker のインストールが必要です。
ChefDK を利用している場合は、次のコマンドでインストールできます。(開発環境にはインストール済みです)
chef gem install kitchen-docker
.kitchen.yml の編集
Kitchen でインスタンスを立てて Recipe を実行するには、.kitchen.yml を編集します。
--- driver: name: docker provisioner: name: chef_zero platforms: - name: centos driver_config: image: centos:centos6 forward: 8080 suites: - name: default run_list: - tar - java - jenkins attributes:
driver
標準では vagrant ですが、開発サイクルを早くまわすために、より軽量・高速な docker を使用します。
driver_config
kitchen-docker の設定を書きます。
image
ベースとする docker image の名前を指定します。
利用できる image 名は Dockerfile の FROM 句 で指定できるものと同じです。
forward
ホストマシンにフォワーディングするポート番号を指定します。
この例では jenkins が使用する 8080 ポートがホストマシンから見えるように指定しています。
run_list
実行する Recipe を指定します。
この例では自作した jenkins Cookbook の Recipe を指定しています。
ただ、Jenkins の動作には Java が必要ですので、Opscode Community の java Cookbook、tar Cookbook(java Cookbook の動作に必要) も指定しています。
※ 外部の Cookbook を使用するには後述する Berksfile の編集が必要です。
attributes
Recipe にわたす Attribute (Recipe に対するパラメータのようなもの)を指定します。
Berkshelf とは
Cookbook の依存関係を解決してくれるツールです。
http://berkshelf.com/
設定ファイル(Berksfile)に使いたい Cookbook を定義しておくと、その Cookbook が依存する Cookbook を含めて再帰的に Git や Opscode Community からとってきてくれます。
Ruby の Bundler と似ているらしいです。(Ruby わからないですし、Bundler も使ったことないですが)
Berksfile の編集
Opscode Community の Cookbook であれば、次のように名前を指定するだけで OK です。
source "https://api.berkshelf.com" cookbook 'tar' cookbook 'java' metadata
Opscode Community 以外の Cookbook を使うには次のように書きます。
# ローカルファイルシステム cookbook 'pvpnet', path: '/Users/reset/code/riot-cookbooks/pvpnet-cookbook' # Git リポジトリ cookbook 'mysql', git: 'git://github.com/opscode-cookbooks/mysql.git'
Kitchen インスタンスの起動とプロビジョニング
次のコマンドを実行すると、.kitchen.yml に基づいたインスタンスが起動し、Recipe が実行されます。
$ kitchen setup
成功したら、Kitchen インスタンスにログインしてみてください。
[vagrant] $ kitchen login kitchen@localhost’s password: kitchen
※ パスワードは 'kitchen' のようです。
ログインできたら、Recipe が期待通りに動作したか確認してみてください。
[kitchen] $ sudo service jenkins status jenkins (pid 1647) is running... [kitchen] $ sudo grep JENKINS_USER /etc/sysconfig/jenkins JENKINS_USER="kitchen" [kitchen] $ stat --format='%a %U:%G %n' /var/*/jenkins 750 kitchen:kitchen /var/cache/jenkins 755 kitchen:kitchen /var/lib/jenkins 750 kitchen:kitchen /var/log/jenkins [kitchen] $ exit
うまくいっていない場合は、Cookbook を修正し、再度プロビジョニングを行います。
$ kitchen converge
どうしてもうまくいかない場合は Kitchen インスタンスを破棄してからプロビジョニングを行います。
$ kitchen destroy $ kitchen setup
kitchen の主なコマンド
# インスタンスの生成 kitchen create # Chef-Solo のインストールと初回のプロビジョニング kitchen setup # プロビジョニング kitchen converge # Serverspec の実行 kitchen verify # ssh ログイン kitchen login # インスタンスの破棄 kitchen destroy
Web ブラウザで Jenkins にアクセス
docker コマンドでコンテナのポートを確認します。
$ docker inspect --format='{{.NetworkSettings.Ports}}' `docker ps -n=-1 -q` map[22/tcp:[map[HostIp:0.0.0.0 HostPort:49153]] 8080/tcp:[map[HostIp:0.0.0.0 HostPort:49154]]]
コンテナの 8080 ポートがホストの 49154 にフォワーディングされていることが確認できます。
Firefox などの Web ブラウザで http://localhost:49154/ にアクセスしてみてください。
Jenkins の画面が表示されていれば成功です。
0 コメント