Chefでなにが実行されるのかの追い方

※chef-soloとかlocalmode前提の資料です。社内で需要があるようだったので。
手順だけ与えたら何も考えずに実行されちゃうホラーな危うい状況を回避する目的で軽くかいてます。
機能を把握しないままコマンド打つのやどのように冗長性が保たれるか知らずに構成組むのと同じことで
Chefも何が行われるか分からないで実行すると無知は罪になる場合があるという単なる事実を認識するとよさげ。

chefリポジトリ内にあるchef用の設定ファイルにそれぞれの機能のpathを指定しているはず。

```
ex)
cat /path-to-ChefRepo/.chef/knife.rb
--------------
chef_repo = File.join(File.dirname(__FILE__), "..")
current_dir = File.dirname(__FILE__)
log_level                :info
log_location             STDOUT
#node_name                `uname -n`
client_key               "#{current_dir}/dummy.pem"
validation_client_name   'chef-validator'
validation_key           "#{current_dir}/dummy.pem"
#validation_key           "/etc/chef/validation.pem"

cookbook_path    ["#{chef_repo}/cookbooks", "#{chef_repo}/site-cookbooks"]
node_path        "#{chef_repo}/nodes"
role_path        "#{chef_repo}/roles"
environment_path "#{chef_repo}/environments"
data_bag_path    "#{chef_repo}/data_bags"
encrypted_data_bag_secret "#{chef_repo}/data_bag_key"
knife[:berkshelf_path] = "#{chef_repo}/cookbooks"
#knife[:ssh_user] = ""
#knife[:ssh_password] = "" 
knife[:ssh_port] = 22
knife[:editor] = "vim"
localmode true

chef_server_url          'http://127.0.0.1:8889'
syntax_check_cache_path  "#{current_dir}/syntax_check_cache"
---------------------
```

chefリポジトリ直下のディレクトリの解説は以下の通り。

```
　 cookbooks	：サードパーティのクックブック置き場
 　data_bags	：data_bagsのデータ置き場
 　environments	：環境設定ファイル置き場
 　nodes	：ノード（ホスト・各サーバ）設定ファイル置き場
 　roles	：役割設定ファイル置き場
 　site-cookbooks	：自作クックブック置き場（クックブックはレシピ、配布ファイル等を含む）
```

まず実行対象のroleかnodeのrun_listを見る。

```
ex)
cat /path-to-ChefRepo/roles/log.json
----抜粋----
"run_list": [
"recipe[base::yum_custom]",
"recipe[base]",
"recipe[base::rsyslog]",
"recipe[ldap::ldap-client]",
"recipe[fluentd::fluentd_server]",
"recipe[zabbix::zabbix-agent]"
]
```

run_listに列挙されてるレシピが上から順に実行されるはずなのでそれを順に見ていく
recipe[cookbook::recipe]という感じにかかれておりレシピのありかのパスは以下のあたり。
/path-to-ChefRepo/{site-cookbooks,cookbooks}/cookbook-name/recipes/recipe-name.rb
run_listはrole[role-name]という書き方もできてnodeのjsonファイルにはそう書いたりする。

```
ex)
cat /path-to-ChefRepo/site-cookbooks/base/recipes/ntp.rb
```

レシピ内ではinclude_recipeで他のレシピを呼びだしたりすることもある。
レシピは処理に応じてそれを定義するためのresourceを用いて書かれている。
ファイルを置くにはcookbook_file,リモートファイルを取得するにはremote_file、
ディレクトリを作るにはdirectory,パッケージインストールにはpackage、
サービス停止や無効化や起動有効化などにはserviceというそれぞれのリソースがある。
https://docs.chef.io/chef/resources.html
http://matome.naver.jp/odai/2136687268845478601

レシピのなかで呼ばれてるattribute（≒変数）やファイルの内容を確認していく

attributeの場合は見る箇所はcookbook内のattributeディレクトリに収められたdefault.rbなどのファイル、
対象の/path-to-ChefRepo/{environments,roles,nodes}/*.jsonなどのファイル。

attributeに関しては以下も参考に。
"属性（attribute）のコレクションはマージされる - Meta Search":
http://metasearch.sourceforge.jp/wiki/index.php?ChefTips#b810a0b2
"【Chef Solo】attributeはどう使い分けるべきか。 ｜ Developers.IO":
http://dev.classmethod.jp/server-side/chef/attribute-overrides-pattern/

templateで呼ばれるattributeを含む元ファイルの相対パスの位置は、
/path-to-ChefRepo/site-cookbooks/cookbook-name/templates/default/の下あたり。
cookbook_fileで呼ばれるファイルの相対パスの位置は、
/path-to-ChefRepo/site-cookbooks/cookbook-name/files/default/の下あたり。

あとdata_bagsというグローバルなデータを格納する場所があるのでそれを呼んでるようならそれも見る。
見方が分からない場合には以下の記事やググるとか聞くなどで解決してください。
http://devlab.isao.co.jp/data_bags_exsample/

以上により何がどう設定されるのかが分かるようになる。はず。

心配な場合もそうでない場合もレシピの適用の前にはドライランでなにが適用されるのか必ず確認するのがベター。
レシピ修正後にci的なレシピのテストするだけの環境とかあればそこでtest-kitchenなどでテストするのもよい。

knife solo cookなら-Wを付けると実際には実行されない。
ただしbashやscriptリソースで処理した結果できるファイルなど、その時点では実際には存在しないものをもとに行われる処理についてはエラーが帰ってきます。
実行順序については以下も見るとよいです。
http://www.engineyard.co.jp/blog/2013/chef-recipe-lifecycle/

とりあえずこんなところで。
みていただいてありがとうございました。