ページ ツリー

比較バージョン

キー

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

目次

 

基本的な用語

Chef でのプロビジョニングを行うには、まず Resource、Recipe、Cookbook という単語をおさえておきましょう。
これは、Chef を使うにあたって最低限作らなければいけないものです。 

 

Section
Column

Resource

Resource はプロビジョニング先の "ある部分" の "あるべき状態" を宣言的に定義する を宣言的に記述する DSL です。
各 Resource にはユニークな名前を指定する必要があり、それがプロビジョニング先の ”どの部分か” を表しています。
そして、Resource の do ~ end ブロックに ”あるべき状態” を定義します。(ResourceType によって定義できる内容は異なります。)Chef でのプロビジョニングは、Resource があるべき状態に収束されることを意味します。

Recipe

Recipe は Resource を記述するためのファイルです。
Ruby のコードをそのまま使って Resource を定義できます。 Recipe

プロビジョニングを実行すると、Recipe がコンパイルされ、Recipe に定義した Resource はプロビジョニングの実行時に解釈され、収束するべき Resource がキューイングされます。 
基本的に、Resource は Recipe に定義した順でキューイングされます。
Recipe に書いた Ruby コードは Resource が収束されるときでなく、キューイングされるときに実行されることに注意してください。 Collection に登録されます。 
Resource の収束は、基本的には Resource Collection に登録された順で行われます。

Cookbook

Cookbook は Recipe を意味のある単位で取りまとめたものです。
Cookbook は複数の環境で使いまわすことができ、たいていの場合はインストールするアプリケーションやサービス単位で作成されます。 

Cookbook も名前で管理されるので、ユニークで、かつ内容を表す名前をつけましょう。

Column

 

Drawio
diagramNamechef 用語.drawio
revision1

 

Cookbook をつくる

Cookbook のひな形の生成

まずは Cookbook を作成しましょう。 

ChefDK の chef generate cookbook コマンドを使えば簡単に Cookbook のひな形を生成できます。

コード ブロック
$ cd workspace
$ chef generate cookbook <Cookbook 名>
情報
chef generate cookbook コマンドで生成されるもので、重要なファイル.kitchen.yml
Kitchen の設定ファイル
テスト用のインスタンスや実行するプロビジョニングの設定を記述
Berksfile
Berkshelf の設定ファイル
Kitchen でプロビジョニングを行うときの依存する Cookbook を記述

Cookbook のディレクトリ構成

パス概要
recipes/

Recipe を置きます。 

attributes/Attribute を使う場合、ここにデフォルト値を定義するファイルを置きます。
templates/Template を使う場合、ここに eRuby ファイルを置きます。
files/File を使う場合、ここにファイルを置きます。
resources/LWRP を使う場合、ここに lightweight resource を置きます。
providers/LWRP を使う場合、ここに lightweight provider を置きます。
metadata.rbCookbook の名前やバージョン、依存関係などの情報を記述します。
BerksfileBerkshelf の設定ファイルです。
Kitchen でテストをするときに依存する Cookbook を定義します。
README.mdCookbook
の説明書
 metadata.rb
Cookbook の基本情報を記述
  • recipes/default.rb
    デフォルトで実行する Recipe
  • の README を記述します。
    .kitchen.ymlKitchen の設定ファイルです。
    Cookbook のテスト環境を定義します。

     

    Cookbook を Eclipse で編集しよう

    Eclipse のプロジェクトファイル ".project" をつくっておけば、Cookbook を Eclipse プロジェクトとして開けます。
    ツリービューとタブエディタ(だけ)は便利なので、 他によいエディタがない場合は、次の手順で Eclipse プロジェクトをインポートしましょう。

    .project を生成

    スクリプトを実行し .project を生成します。

    ...

    注意

    "gen-eclipse" は開発環境の ~/bin/gen-eclipse に置いてある .project 生成用のスクリプトです。

     

    プロジェクトをインポート

    Eclipse を起動し、プロジェクトをインポートします。

    123

    File -> Import...

    General -> Existing Projects into Workspace

     Next

    「/home/vagrant/workspace/<Cookbook 名>」を追加

    Finish 

     

    Package Explorer に隠しファイルも表示させる

    標準では .kitchen.yml が見えないので、次の手順で隠しファイルを表示します。

    12

    Package Explorer の ▽ を選択 -> Filters…

     「.*resources」のチェックを外す
    OK



    Recipe

    ...

    を書く

    default Recipe

    ...

    Chef では、サーバーのあるべき状態を Recipe(ソースコード)として記述します。
    Recipe は「ファイルのダウンロード」や「コマンドの実行」など、さまざまな機能をもつ Resource から構成されます。

    Resource は Chef 公式のものだけで40種類以上ありますが、基本的な構文はどれも同じで、
    次のように、ユニークな Name をもち、1つ以上の Attribute によりパラメータを指定でき、実行時の動作を Action で指定します。

    コード ブロック
    resource "name" do
      attributeA "valueA"
      attributeB "valueB"
      action :action
    end

     

    次の Recipe は「'/tmp' ディレクトリで、 'tar zxf archive.tar.gz' というスクリプトを、bash で実行する、'extract tar file' という名前の Resource」を定義したものです。

    コード ブロック
    bash 'extract tar file' do
      cwd '/tmp'
      code 'tar zxf archive.tar.gz'
      action :run
    end

    ここでは Chef 標準の bash Resource をベースに、cwd Attribute に実行時のディレクトリを、code Attribute に実行するスクリプトを指定し、
    Action には Resource の実行時にスクリプトが実行されるように :run を指定していて、
    これらの指定を行った Resource に 'extract tar file'  という Name をつけています。

    指定できる Action や Attribute は Resource ごとに異なるので、Resource のドキュメントを逐一確認するようにしてください。
    bash Resource であれば ここ です。

    ヒント

    Resource のドキュメントは見つけにくいです。
    Chef の公式ドキュメントから辿るよりも、Google で「Opscode bash」などと検索したほうが早く見つけられたりします。
    また、Mac であれば Dash に Chef のドキュメントがあるので、これを使うのもいいかもしれません。

     

    Resource の実行順序

    ...

    chef generate cookbook コマンドを実行すると、./recipes/default.rb というファイルができていると思います。
    それが Cookbook がデフォルトで適用する Recipe です。
    基本的には、このファイルに Recipe を書いていきます。

    ヒント

    default Recipe 以外の Recipe は chef generate recipe コマンドで追加できます。

    コード ブロック
    $ chef generate recipe <Cookbook のパス> <Recipe の名前>


    Resource の要素

    Recipe には Resource を定義していきます。
    Resource とは、プロビジョニング先の ”ある部分” の ”あるべき状態” を宣言する DSL で、具体的には以下の要素で構成されます。

    Section
    Column

    ResourceType

    Resource の型を表します。

    yum パッケージの状態を定義する yum_package、任意のコマンドの実行状態を定義する execute などがあります。

    ResourceType によって、指定できる Attribute や Action は異なります。
    詳細は各 ResourceType の公式ドキュメントに記載されているので、確認するようにしてください。

    Name

    Resource の名前です。
    ユニークな名前を指定します。

    Attribute

    Resource の属性です。
    Resource がどのような状態であるべきか、詳細な情報を指定します。

    yum_package であれば package_name や version などを指定できます。
    yum_package
     では Resource の Name がそのまま package_name に指定される仕様になっています。

    Action

    Resource の収束のされ方です。 

    yum_package であれば、インストールされている状態(:install)、アンインストールされている状態(:remove)などを指定できます。

    Column

    Drawio
    diagramNameyum_package.drawio
    revision1

    ヒント

    ResourceType についての公式ドキュメントは Chef の公式ドキュメントから辿ると非常に見つけにくいです。
    Google で「Opscode <ResourceType 名>」などと検索したほうが早く見つけられたりします。
    また、Mac であれば Dash に Chef のドキュメントがあるので、これを使うのもオススメです。


    Resource の実行順序

    Recipe は上から順にコンパイルされ、Resource Collection に格納されます。
    基本的には Resource Collection に格納された順で Resource が収束されますので、
    たとえば、「ファイルをダウンロード」してから「そのファイルを解凍」したい場合は、次のように記述できます。 

    コード ブロック
    remote_file '/tmp/archive.tar.gz' do
      source 'http://path/to/archive.tar.gz'
      action :create
    end
    
    bash 'extract tar file' do
      cwd '/tmp'
      code 'tar zxf archive.tar.gz'
      action :run
    end
    ヒント

    notifies などを利用して、Resource の実行順序を制御することも可能です。

    ヒント

    Recipe に書いたコードは基本的に に書いたコードは Recipe が解釈されるときに実行されます。がコンパイルされるときに実行されます。
    Resource が実行されるタイミングでコードを実行したい場合は が収束されるタイミングでコードを実行したい場合は ruby_blocklazy を使います。

     

    冪等性を確保する

    Chef では何度 Recipe を実行しても同じ結果になることが望まれています。
    これは Chef 標準の package Resource などを使用していれば Resource 側で確保してくれるのですが、
    bash Resource などでは自力でがんばって確保するしかありません。 

     

    冪等性を確保するには、notでは Resource の収束結果は何度実行しても常に同じでなければいけません。
    yum_package などであれば、何も考えなくとも冪等性が確保されるのですが、
    execute や bashruby_block などではサーバーにどのような変更が行われるのか Chef が判断できないので、
    自力で冪等性を確保する必要があります。 

    冪等性を確保するためのひとつの手段として、ガード条件 があります。
    これは、not_if や only_if を使用して Resource ガード条件を設定します。に収束するための条件を設定するものです。

     

    例えば、特定のファイルが存在しないときだけ Resource を実行するには次のように書きます。を収束するには次のように書きます。

    コード ブロック
    exexute 'install peco'
      command 'cp /tmp/peco_linux_amd64/peco /usr/local/bin/peco'
      not_if { File.exists?('/usr/local/bin/peco') }
    end

    この例では、Resource が実行される直前に が収束される直前に not_if ブロックの Ruby コードが実行され、結果が false のときだけ Resource が実行されます。が収束されます。
    逆に結果が true のときだけ Resource が実行されるようにしたい場合は が収束されるようにしたい場合は only_if を使います。

     

    また、Ruby のブロックでなく、文字列を直接わたすこともできます。

    ...

    この場合は not_if にわたした文字列がシェルスクリプトとして実行され、実行結果が 0 以外のときだけ Resource が実行されます。が収束されます。
    さきほどと同じように、結果が 0 のときだけ Resource が実行されるようにするには が収束されるようにするには only_if を使います。 

     

    Recipe を書く手順 

    1. 具体的に何をしたいのかを明らかにする
    2. 使えそうな Resource をさがす
    3. 実際に Recipe を書く

    ...

    Google で検索してもいいですし、Dash を使ってもいいですし、Chef実践入門Chef活用ガイド のような書籍を利用するのも手です。


    実際に作ってみる

    ここまでの手順がなんとなくわかったら、次は実際に Cookbook を作ってみます。

    次のページ に進んでください。