ようへいの日々精進XP

よかろうもん

databags を使ってみた一部始終(1)

要件

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",
                }

        ]
}

レッツクッキング

出来上がり

f:id:inokara:20130505081233p:plain

まとめ

ハマったところ

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 ファイルを展開することが出来た。

f:id:inokara:20130505085119p:plain

こちらに関しても、Opscode のドキュメントをちゃんと読めば理解することが出来る。

用途について

  • 冒頭にもあるように cookbooks ごとに持たせる情報よりも、もっと大きい枠の node に対して設定を施す際に使いたい
    • 例えば、ユーザーアカウント等
    • Opscode のドキュメントもユーザーアカウントを例に上げているし、ネット上の情報も同様にユーザーアカウントの設定を例に上げている
    • 個人的には /etc/hosts ファイルにレコードを追加、管理する場合に使えないか運用面と合わせて検討中

スライド