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_solo platforms: - name: centos-6.4 driver_config: image: centos:centos6 forward: 8080 suites: - name: default run_list: - recipe[tar::default] - recipe[java::default] - recipe[jenkins::default] attributes: java: install_flavor: oracle jdk_version: 7 java_home: /usr/java/default oracle: accept_oracle_download_terms: true
driver
標準では Vagrant を利用しますが、Cookbook の開発サイクルをより早くまわすために、軽量・高速な docker を使用します。
Kitchen から docker を利用するには docker Engine、kitchen-docker のインストールが必要です。
※ 今回の環境には既にインストールされています。
driver_config
kitchen-docker の設定です。詳細は kitchen-docker のドキュメント [ https://github.com/portertech/kitchen-docker ] を参照してください。
image で、ベースとする docker image の名前を指定します。
利用できる image 名は Dockerfile の FROM 句 [ https://docs.docker.com/reference/builder/#from ] で指定できるものと同じです。
forward ではホストマシンにフォワーディングするポート番号を指定します。
今回は jenkins が使用する 8080 ポートをホストマシンから見えるようにフォワーディングするように指定しています。
run_list
プロビジョニング時に実行する Recipe を指定します。
Jenkins の動作には Java が必要ですので、Opscode Community の java Cookbook を使ってインストールするように指定しています。
また、java Cookbook の動作には tar が必要なので、これも Opscode Community の tar Cookbook を使うように指定しています。
そして、自作した jenkins Cookbook も忘れずに指定します。
※ プロビジョニングに外部の Cookbook が必要な場合は後述する Berksfile の編集が必要です。
attributes
プロビジョニング時に Recipe にわたす Attribute を指定します。
Attribute とは、 Recipe に対するパラメータのようなものです。
今回は java Cookbook の Attribute を指定しています。
詳細は java Cookbook の README.md [ http://community.opscode.com/cookbooks/java ] を参照してください。
Berkshelf とは
Berksfile の編集
プロビジョニング時に必要な外部の Cookbook は、このファイルをもとに berkshelf によって解決されます。Opscode Community の Cookbook であれば、次のように名前を指定するだけでOKです。
source "https://api.berkshelf.com" cookbook ‘tar' cookbook 'java' metadata
※ Opscode Community 以外の依存
Git リポジトリ
git: ‘https://path/to/cookbook.git’ローカルファイルシステム
path: ‘/path/to/cookbook’
Kitchen インスタンスの起動とプロビジョニング
では、作成した Cookbook を Kitchen のインスタンスへプロビジョニングしてみましょう。
$ kitchen setup
プロビジョニングが成功したら、Kitchen インスタンスにログインしてみてください。
[vagrant] $ kitchen login kitchen@localhost’s password: kitchen [kitchen] $ sudo service jenkins status jenkins (pid 17656) を実行中... [kitchen] $ exit
ログインできたら、jenkins サービスが実行されているか確認してみましょう。
/etc/sysconfig/jenkins の内容も確認してみてください。
うまくいっていない場合は、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 ps CONTAINER ID PORTS e35e89ea252a 0.0.0.0:49153->22/tcp, 0.0.0.0:49154->8080/tcp
コンテナの 8080 ポートがホストの 49154 にフォワーディングされていることが確認できます。
Firefox などの Web ブラウザで http://localhost:49154/ にアクセスしてみてください。
Jenkins の画面が表示されていれば成功です。