humangas's blog

自分の振り返りを適当に書いてます。書きっぷりはそん時の気分によって変わります。

入門Chef Solo:17-レシピ落ち穂拾い ー run_list,ファイル分け,include_recipe

入門Chef Solo - Infrastructure as Code

入門Chef Solo - Infrastructure as Code

JSONファイル(Node Object)へのrun_listの書き方について、default.rb以外のレシピをどう書いて実行するのか。また、他のレシピ内容を取り込むinclude_recipeについても解説している。

run_listの書き方

{     
    "runt_list":[  
        "nginx::default",  
        "apache2",  
        "apache2::mod_ssl",  
    ]  
}  

この場合、以下がそれぞれ実行されます。

  • nginxクックブックのrecipes/default.rb
  • apache2クックブックのrecipes/default.rb
  • apache2クックブックのrecipes/mod_ssl.rb

run_listに渡しているものがレシピであることを明示するため

{
    "run_list":[
        "recipe[nginx::default]",
        "recipe[apache2]",
        "recipe[apache2::mod_ssl]"
    ]
}

とも書ける。

適用したいレシピをグルーピングするのにRoleという機能が使えて、run_listにはRoleを渡すこともできる。

{  
    "run_list":[  
        "recipe[yum::epel]",  
        "role[webserver]",  
    ]  
}  

レシピのファイル分け

レシピファイルを複数用意したいのはどういった場合なのか?→ 明示的なポリシーはChefにはない模様。
Opscode Communityで配布されているクックブックを見ることでなんとなくの方針が見える。

例えばapache2は、以下のように定義されている。

  • Apache本体・・・default.rb
  • mod_ssl・・・mod_ssl.rb

ファイル分けがなされていると、run_listを書くユーザーは「Apache本体は使いたいけど、mod_sslは不要」といったNode Objectを定義することができて便利。レシピをより汎用的に書くために、いういったファイル分けを意識する必要が出てくる。

include_recipe

あるレシピから、別のレシピの内容をそのまま取り込みたい場合、
include_recipeを使用してレシピに、

include_recipe "bulid-essential::default"  

と記載することで、build-essentialというレシピを取り込む。 (build-essentialクックブックがcookbook pathの通ったディレクトリに配置されている前提)

include_recipeを使いたいというケースはあまり多くない。
サードパーティのクックブックを利用したりする場合に、include_recipeすることを前提に書かれていることがあり使う必要に迫られるかもしれない。

include_recipeに似た概念として、レシピ内に他のクックブックとの依存関係を記述する dependencyというシンタックスもあるが、Chef Soloでは利用しない。