開発の流れ
Cookbook 開発の流れ
ひとつの Cookbook を完成させるには、次のような手順を辿ることになります。
Cookbook 作成
まずは Cookbook を作成します。
Recipe 編集
テキストエディタや IDE で Recipe を編集します。
Kitchen でプロビジョニング
Kitchen でテスト用インスタンスを立てて、プロビジョニングを行います。
ここでプロビジョニングが成功すれば、Cookbook の完成です。
失敗した場合は、Recipe を編集しなおします。
Cookbook をつくろう
Cookbook の生成
まずは、Chef のソースコードである Recipe を格納するための Cookbook をつくります。
$ cd workspace $ chef generate cookboook jenkins
`chef` は ChefDK のコマンドです。
ここでは 'jenkins' という名前の Cookbook を `chef` コマンドで生成しています。
Cookbook は Chef のソースコードを取りまとめた単位です。
Cookbook の中には実際のソースコード(Recipe)が入ります。
Eclipse にインポート
Cookbook を Eclipse プロジェクトとしてインポートしましょう。
まずは、Eclipse プロジェクトを生成します。
$ cd jenkins $ gen-eclipse
Eclipse を起動して、生成したプロジェクトをインポートします。
1.
アプリケーション -> プログラミング -> Eclipse
2.
OK
3.
File -> Import...
4.
General -> Existing Projects into Workspace
5.
Browse -> 「jenkins」ディレクトリを選択 -> OK -> Finish
`gen-eclipse` は Eclipse プロジェクトを生成するシェルスクリプトです。
Recipe を書こう
前準備
今回は Jenkins をインストールする Recipe を書くことにします。
そこでまずは Chef でなく、手作業で Jenkins をインストールする方法をおさらいしておきましょう。
(実行する必要はありません)
$ yum install java-1.7.0-openjdk $ wget http://pkg.jenkins-ci.org/redhat/jenkins-1.576-1.1.noarch.rpm $ yum install jenkins-1.576-1.1.noarch.rpm $ service jenkins start $ chkconfig jenkins on
では、この手順を Recipe にするとどうなるでしょうか。
インストール先は CentOS 6.5 です。
他にもインストール手順は様々ですが、今回はこの手順でインストールするものとして進みます。
default Recipe を書く
Cookbook のメイン Recipe をつくります。
内容は、Jenkins をインストールするものです。
# OpenJDK をインストール(Jenkins の実行に必要なため) yum_package 'java-1.7.0-openjdk' # Jenkins の rpm をダウンロード remote_file "#{Chef::Config[:file_cache_path]}/jenkins-1.568-1.1.noarch.rpm" do source 'http://pkg.jenkins-ci.org/redhat/jenkins-1.568-1.1.noarch.rpm' action :create_if_missing end # Jenkins をインストール yum_package "#{Chef::Config[:file_cache_path]}/jenkins-1.568-1.1.noarch.rpm" # Jenkins サービスを自動起動 service 'jenkins' do action [:start, :enable] end
Recipe にはサーバーのあるべき状態を Resource として定義します。
ここでいう yum_package や remote_file、service などが Resource の定義です。
基本的な Resource 定義の書式は次のようになっています。
<ResourceType> "ResourceName" do <Attribute> "hoge" <Attribute> "fuga" action <Action> end
Resource がどのような Attribute や Action を持つかは ResourceType により様々です。
Chef のドキュメントを参照するとよいでしょう。
今回登場する ResourceType の概要とドキュメントのリンク
ResourceType | 概要 | ドキュメント |
---|---|---|
yum_package | パッケージのインストール | http://docs.getchef.com/resource_yum.html |
remote_file | Web 上のファイルをダウンロード | http://docs.getchef.com/resource_remote_file.html |
service | サービスの制御 | http://docs.getchef.com/resource_service.html |
Kitchen で試してみよう
Kitchen インスタンスを定義
作成した Cookbook を試すための実行環境(Kitchen インスタンス)を定義します。
--- driver: name: docker provisioner: name: chef_zero platforms: - name: centos driver_config: image: centos:centos6 forward: 8080:8080 suites: - name: default run_list: - jenkins
YAML 形式のファイルはインデントにタブを使えないので注意してください。
Kitchen は Vagrant や EC2、Docker Engine などでインスタンスを起動して Cookbook の動作をチェックするためのツールです。
.kitchen.yml には Kitchen で起動するインスタンスの設定を定義します。
driver:
高速・軽量な Docker Engine を使うように指定します。
provisioner:
Chef Zero によるプロビジョニングを行うように指定します。
platforms:
Docker Engine のコンテナのベース Image として centos:centos6 を使用するように指定します。
また、Jenkins の起動確認のために 8080 ポートをフォワーディングするように指定します。
suites:
jenkins Cookbook を収束するように指定します。
プロビジョニングの実施
Kitchen インスタンスを起動し、Cookbook を転送してプロビジョニングを行います。
$ kitchen converge
`kitchen converge` コマンドを実行すると、.kitchen.yml の定義に従って Kitchen インスタンスが生成され、プロビジョニングが行われます。
kitchen のその他のコマンド
Kitchen インスタンスへの ログイン
$ kitchen login
※ パスワードは 'kitchen'
Kitchen インスタンスの破棄
$ kitchen destroy
Web ブラウザで確認
.kitchen.yml の設定により、Kitchen インスタンスの 8080 ポートがホストマシンの 8080 ポートにフォワーディングされています。
ホストマシンの Web ブラウザで「http://localhost:8080」とアクセスしてみてください。
このように、Jenkins の画面が表示されていたら成功です。
ここまでくれば、まずひとつの Cookbook を作れたことになります。
作成した Cookbook は、Vagrant の VM や Knife Solo を使って他のサーバーへのプロビジョニングにそのまま使うことができます。
ChefsMeeting 本編ではより踏み込んで、実用的に使うための勉強をしています。
よろしければそちらもご参加ください。
本編の内容(一部)
- Vagrant の使い方
- Knife Solo の使い方
- Cookbook の自動テスト
- Serverspec
- Foodcritic
- ガード条件、実践的な Recipe の書き方
- Attribute の使い方
コメントの追加