ページ ツリー

比較バージョン

キー

  • この行は追加されました。
  • この行は削除されました。
  • 書式設定が変更されました。

目次

Kitchen を使う準備

Kitchen とは

Vagrant、EC2、Docker Engine など、任意のインスタンスを立てて、その中で Cookbook の動作を試行できるツールです。
http://kitchen.ci/ 

 

今回は高速・軽量な Docker Engine のインスタンスで Cookbook の動作チェックをしていきます。

情報

Docker Engine は Linux でのコンテナ型の仮想化を提供するツールです。

ハイパーバイザ型がマシンそのものをエミュレートするのに対し、コンテナ型の仮想化ではホストマシンのカーネル上に独立したユーザー空間を構築するのにとどまります。

Image Added

ハイパーバーザ型と比較すると、コンテナ型の仮想化はホストのもつリソースをほぼそのまま扱えるため、より軽量・高速に仮想化を実現できます。

また、Docker Engine ではコンテナの差分管理が可能です。
たとえば、いちど CentOS をインストールしたコンテナをつくってしまえば、CentOS + apache や CentOS + MySQL などのコンテナを構築するときに毎回 CentOS をインストールする必要はありません。

Image Added

KitchenDocker Engine を利用するには、kitchen-docker のインストールが必要です。
ChefDK を利用している場合は、次のコマンドでインストールできます。(開発環境にはインストール済みです) 

コード ブロック
chef gem install kitchen-docker

 

.kitchen.yml の編集

作成した Recipe が期待したとおりに動いているか確認してみましょう。
確認には Kitchen を利用すると便利です。

Kitchen とは、任意の環境をインスタンスとして起動し、プロビジョニングを行い、その結果を検証できるツールです。
インスタンスは何度でも簡単に作り直すことができるので、気軽に Chef の Recipe を試すことができます。

まずは Kitchen を使用するために、設定ファイル Kitchen でインスタンスを立てて Recipe を実行するには、.kitchen.yml を編集しましょう。を編集します。

Section
Column
コード ブロック
title.kitchen.yml
---
driver:
  name: docker

provisioner:
  name: chef_solozero

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 
Column

driver

軽量・高速な 標準では vagrant ですが、開発サイクルを早くまわすために、より軽量・高速な docker を使用します。Kitchen から docker を利用するには

driver_config

kitchen-docker のインストールが必要です。 の設定を書きます。

 

コード ブロック
$ chef gem install kitchen-docker 

※ 今回の環境には既にインストールされています。

driver_config

centos をベース image とします。
image

ベースとする docker image の名前を指定します。
利用できる image 名は Dockerfile の FROM 句で指定できるものと同じです。
詳細は Dockerfile のリファレンスを参照してください。
https://docs.docker.com/reference/builder/#from ]

forward ではホストマシンにフォワーディングするポート番号を指定します。
今回は jenkins が使用する 8080 ポートに http://localhost:8080 でアクセスできるように指定しています。
詳細は kitchen-docker のドキュメントを参照してください。
https://github.com/portertech/kitchen-docker ]

で指定できるものと同じです。

forward

ホストマシンにフォワーディングするポート番号を指定します。
この例では jenkins が使用する 8080 ポートがホストマシンから見えるように指定しています。

run_list

プロビジョニング時に実行する 実行する Recipe を指定します。
この例では自作した jenkins Cookbook の Recipe を指定しています。

ただ、Jenkins の動作には Java が必要なので、今回は Opscode が必要ですので、Opscode Community の java Cookbook を使うことにします。
また、java Cookbook の動作には tar が必要なので、これも Opscode Community の tar Cookbook を使います。
自作した jenkins Cookbook も忘れずに指定しましょう。
※ プロビジョニングに外部の Cookbook が必要な場合は後述する
tar Cookbook(java Cookbook の動作に必要) も指定しています。
※ 外部の Cookbook を使用するには後述する Berksfile の編集が必要です。

attributes

プロビジョニング時に Recipe にわたす Attribute を指定します。
Attribute とは Recipe に対するパラメータのようなものです。
今回は Opscode コミュニティの java Cookbook の Attribute を指定しています。
詳細は java Cookbook の 
README.md を参照してください。
Recipe に対するパラメータのようなもの)を指定します。

 

Berkshelf とは

Cookbook の依存関係を解決してくれるツールです。
http://

...

berkshelf.

...

com/

...

 

...

設定ファイル(Berksfile)に使いたい Cookbook を定義しておくと、その Cookbook が依存する Cookbook を含めて再帰的に Git や Opscode Community からとってきてくれます。

Ruby の Bundler と似ているらしいです。(Ruby わからないですし、Bundler も使ったことないですが)

 

Berksfile の編集

プロビジョニング時に必要な外部の Cookbook は、このファイルをもとに berkshelf によって解決されます。Opscode Opscode Community の Cookbook であれば、次のように名前を指定するだけでOKです。であれば、次のように名前を指定するだけで OK です。

コード ブロック
source "https://api.berkshelf.com"

cookbook ‘tar'tar'
cookbook 'java'
metadata

...


ヒント

Opscode Community

...

Git リポジトリ
git: ‘https://path/to/cookbook.git

...

以外の Cookbook を使うには次のように書きます。

コード ブロック
# ローカルファイルシステム
cookbook 'pvpnet', path: '/Users/reset/code/riot-cookbooks/pvpnet-cookbook'
 
# Git リポジトリ
cookbook 'mysql', git: 'git://github.com/opscode-cookbooks/mysql.git'

 

Kitchen インスタンスの起動とプロビジョニング

では、作成した Cookbook を Kitchen のインスタンスへプロビジョニングしてみましょう。次のコマンドを実行すると、.kitchen.yml に基づいたインスタンスが起動し、Recipe が実行されます。

コード ブロック
$ kitchen setup


プロビジョニングが成功したら、Kitchen 成功したら、Kitchen インスタンスにログインしてみてください。

コード ブロック
[vagrant] $ kitchen login
kitchen@localhost’s password: kitchen

※ パスワードは 'kitchen' のようです。


ログインできたら、Recipe が期待通りに動作したか確認してみてください。

コード ブロック
[kitchen] $ sudo service jenkins status
jenkins (pid 17656 1647) を実行中is running...

[kitchen] $ exit

...

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 ps
CONTAINER ID  PORTS
e35e89ea252a    inspect --format='{{.NetworkSettings.Ports}}' `docker ps -n=-1 -q`
map[22/tcp:[map[HostIp:0.0.0.0 HostPort:49153->22]] 8080/tcp, :[map[HostIp:0.0.0.0 HostPort:49154->8080/tcp]]]

コンテナの 8080 ポートがホストの 49154 にフォワーディングされていることが確認できます。
Firefox などの Web ブラウザで http://localhost:49154/ にアクセスしてみてください。
Jenkins の画面が表示されていれば成功です。

Image Added