要件
- Cookbook Refactoring and Extracting Logic into Rubygems を見て databags を使ってみたくなったので試す(上記のスライドは記事の最後に埋め込ませて頂きました...)
databags とは...
attribute と使い分けについて悩みそうになるが、下記のような違いがある。(Chef ハンズオンセミナー(cookbook recipe basic編)で教えて頂いたことをまんま転載)
attribute
- node や resource に紐づいた属性情報
- ruby 形式で記載する
- chef-soloの場合は json
- 多岐にわたる場所で設定可
- 適用の優先順位がある
databags
- node や resource と直に紐づかない情報
- json形式による記述する
- data_bags ディレクトリ以下に、[ファイル名].json 形式で設置
- 暗号化が可能
実際に使ってみる
node の /tmp/ 以下にお刺身に適した魚をリストアップした menu というファイルを作成する cookbook を作る
recipe
${chef-repo}/site-cookbooks/sashimi/recipes/sashimi.rb
sashimis = data_bag_item('fishies','sashimi')['menu'] template '/tmp/menu' do owner "root" group "root" source "menu.erb" variables( :sashimis => sashimis ) end
templates
${chef-repo}/site-cookbooks/sashimi/templates/default/menu.erb
<% for sashimi in @sashimis %> sashimi is <%= sashimi["a"] %> and <%= sashimi["b"] %>. <% end %>
data_bags
data_bags 以下のディレクトリ構成が重要だと思う。理由は後述。
${chef-repo}/data_bags/fishies/menu.json
以下、なんの変哲もない JSON 形式のファイル。
{ "id" : "sashimi", "menu" : [ { "a" : "maguro", "b" : "tai" }, { "a" : "ika", "b" : "tako", } ] }
レッツクッキング
出来上がり
まとめ
ハマったところ
data_bags_item を扱う場合
JSON ファイルに必ず ID を持たせる必要があるにも関わらず、ID を持たせないまま書いていた。
"menu" : [ { "a" : "maguro", "b" : "tai"
上記だとダメ。下記のように "id" : "sashimi" を付ける。ここにもちゃんと書かれていました...。
"id" : "sashimi", "menu" : [ { "a" : "maguro", "b" : "tai"
参考にさせて頂いた blog でも同じポイントが書かれていて、大変、助かりました。
data_bags ディレクトリ以下
こちらも data_bag_item を扱う場合、data_bags 以下のディレクトリ構成と recipe の data_bags の指定は関連付ける必要がある。
chef-repo/data_bags$ tree . └── fishies └── menu.json 1 directory, 1 file
上記の通りに設定した場合には、recipe には下記のように記載することで JSON ファイルを展開することが出来た。
こちらに関しても、Opscode のドキュメントをちゃんと読めば理解することが出来る。
用途について
- 冒頭にもあるように cookbooks ごとに持たせる情報よりも、もっと大きい枠の node に対して設定を施す際に使いたい
- 例えば、ユーザーアカウント等
- Opscode のドキュメントもユーザーアカウントを例に上げているし、ネット上の情報も同様にユーザーアカウントの設定を例に上げている
- 個人的には /etc/hosts ファイルにレコードを追加、管理する場合に使えないか運用面と合わせて検討中
スライド
参考
- About Data Bags
- Chef ハンズオンセミナー(cookbook recipe basic編)
- Chef-solo 「Data Bag Items Must Contain a Hash or Mash!」
- https://github.com/jimhopp/chefspec_exploration.git