ページ ツリー

比較バージョン

キー

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

目次
maxLevel3

開発の流れ

Section
Column
width720px

Cookbook 開発の流れ

ひとつの Cookbook を完成させるには、次のような手順を辿ることになります。

Drawio
diagramName開発の流れ.drawio
revision1
 

Column
Section
bordertrue
Column

Cookbook 作成

まずは Cookbook を作成します。

Recipe 編集

テキストエディタや IDE で Recipe を編集します。

Kitchen でプロビジョニング

Kitchen でテスト用インスタンスを立てて、プロビジョニングを行います。
ここでプロビジョニングが成功すれば、Cookbook の完成です。
失敗した場合は、Recipe を編集しなおします。 

 

Cookbook をつくろう

Cookbook の生成

Section
Column
width720px

まずは、Chef のソースコードである Recipe を格納するための Cookbook をつくります。

コード ブロック
$ cd workspace
$ chef generate cookboook jenkins
Column
Section
bordertrue
Column

`chef` は ChefDK のコマンドです。
ここでは 'jenkins' という名前の Cookbook を `chef` コマンドで生成しています。

 

Cookbook は Chef のソースコードを取りまとめた単位です。
Cookbook の中には実際のソースコード(Recipe)が入ります。

...

前準備

Section
Column
width720px

 Recipe を書く前に、どのような内容の Recipe を書くかを決めましょう。

今回は Jenkins をインストールする Cookbook ですので、まずは 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

これを Chef の では、この手順を Recipe にするとどうなるでしょうか。見ていきましょう。 

Column
Section
bordertrue
Column

インストール先は CentOS 6.5 です。

他にもインストール手順は様々ですが、今回はこの手順でインストールするものとして進みます。

 

default Recipe を書く

Section
Column
width720px

Cookbook のメイン Recipe をつくります。 

内容は、Jenkins をインストールするものです。

コード ブロック
languageruby
titlejenkins/recipes/default.rb
# 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_pakcagepackage "#{Chef::Config[:file_cache_path]}/jenkins-1.568-1.1.noarch.rpm"
 
# Jenkins サービスを自動起動
service 'jenkins' do
  action [:start, :enable]
end
Column
Section
bordertrue
Column

 Recipe にはサーバーのあるべき状態を Resource として定義します。

ここでいう yum_package や remote_file、service などが Resource の定義です。

基本的な Resource 定義の書式は次のようになっています。

コード ブロック
<ResourceType> "ResourceName" do
  <Attribute> "hoge"
  <Attribute> "fuga"
  action <Action>
end

Resource がどのような Attribute や Action を持つかは ResourceType により様々です。
Chef のドキュメントを参照するとよいでしょう。

ヒント
title今回登場する ResourceType の概要とドキュメントのリンク
ResourceType概要ドキュメント
yum_packageパッケージのインストールhttp://docs.getchef.com/resource_yum.html
remote_fileWeb 上のファイルをダウンロードhttp://docs.getchef.com/resource_remote_file.html
serviceサービスの制御http://docs.getchef.com/resource_service.html

...

Section
Column
width720px

作成した 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 形式のファイルはインデントにタブを使えないので注意してください。 

Column
Section
bordertrue
Column

KitchenVagrant や EC2、Docker Engine などでインスタンスを起動して Cookbook の動作をチェックするためのツールです。

.kitchen.yml には Kitchen で起動するインスタンスの設定を定義します。

driver:

高速・軽量な Docker Engine を使うように指定します。

provisioner:

Chef Zero によるプロビジョニングを行うように指定します。

platforms:

Docker Engine のコンテナのベース Image として centos:centos6 を使用するように指定します。
また、Jenkins の起動確認のために 8080 ポートをフォワーディングするように指定ます。ポートをフォワーディングするように指定します。

suites:

jenkins Cookbook を収束するように指定します。

...

Section
Column
width720px

 Kitchen インスタンスを起動し、Cookbook を転送してプロビジョニングを行います。

コード ブロック
$ kitchen converge
Column
Section
bordertrue
Column

`kitchen converge` コマンドを実行すると、.kitchen.yml の定義に従って Kitchen インスタンスが生成され、プロビジョニングが行われます。

 

Drawio
diagramNamekitchen.drawio
size500
revision1

ヒント
titlekitchen のその他のコマンド


Kitchen インスタンスへの ログイン

コード ブロック
$ kitchen login

※ パスワードは 'kitchen'


Kitchen インスタンスの破棄

コード ブロック
$ kitchen destroy

...

このように、Jenkins の画面が表示されていたら成功です。

 

 

ここまでくれば、まずひとつの Cookbook を作れたことになります。
作成した Cookbook は、Vagrant の VM や Knife Solo を使って他のサーバーへのプロビジョニングにそのまま使うことができます。

ChefsMeeting 本編ではより踏み込んで、実用的に使うための勉強をしています。
よろしければそちらもご参加ください。

本編の内容(一部)

  • Vagrant の使い方
  • Knife Solo の使い方
  • Cookbook の自動テスト
    • Serverspec
    • Foodcritic
  • ガード条件、実践的な Recipe の書き方
  • Attribute の使い方