[Chef-Solo]猿でもわかるdata_bag入門

data_bagとは?何がおいしいの?

Chef-Soloには"data_bag"という仕組みがあって、ノード間をまたがって利用するグローバルな値を管理することができます。
よくあげられるのは、管理対象の各サーバに同じ名前のユーザを作成する例です。
data_bags/users/doraemon.json
data_bags/users/nobita.json
のようなファイルを作ってユーザ情報を記述すると、レシピからそれを参照できます。

data_bagを使ってサーバのIPアドレスを管理する

さてここでは、サーバのIPアドレスを"data_bag"に登録してレシピから呼び出す例を紹介します。
サーバのIPアドレスというのは一見ノードの属性のように思えますが、そうではないのです。
サーバ同士で連携してサービスを提供する場合、同じIPアドレスをあちこちに書くはめになったりします。
例えばdbサーバのiptablesにwebサーバのIPアドレスを書いたりしますよね。
"data_bag"を使えば、このような情報をノードをまたいで一元管理することができます。

(なお、ここでは暗号化については解説しません) Chef-Soloでの"hello world"ができているという前提で話をします。
入門ChefSoloに入門してHello Worldしてみた
data_bagsディレクトリを作成してsolo.rbに登録する
cd chef-repo
mkdir data_bags
solo.rbを編集して1行追記
data_bag_path "/path/to/chef-repo/data_bags"
data_bagsにデータを保存する
mkdir data_bags/servers
data_bags/servers/web1.json というファルを新規作成
{
 "id" : "web1",
 "private_ip" : "10.10.10.10",
 "public_ip" : "1.1.1.1"
}
data_bags/servers/web2.json というファルを新規作成
{
 "id" : "web2",
 "private_ip" : "10.10.10.20",
 "public_ip" : "1.1.1.2"
}
レシピからdata_bagsのデータを呼び出す
cookbooks/hello/recipes/default.rb
log "web1 private ip = "  + data_bag_item('servers','web1')['private_ip']
log "web2 private ip = "  + data_bag_item('servers','web2')['public_ip']
こんな感じでレシピを書いて実行すると、
$ chef-repo  sudo chef-solo -o hello -c ./solo.rb
[2014-08-16T02:07:44+09:00] WARN: Starting Chef Client, version 11.12.4
[2014-08-16T02:07:52+09:00] WARN: Run List override has been provided.
[2014-08-16T02:07:52+09:00] WARN: Original Run List: []
[2014-08-16T02:07:52+09:00] WARN: Overridden Run List: [recipe[hello]]
Compiling Cookbooks...
Converging 3 resources
Recipe: hello::default
  * log[web1 private ip = 10.10.10.10] action write
  * log[web2 private ip = 1.1.1.2] action write
レシピからサーバのIPアドレスを取得することができました!

解説

data_bags/servers/web1.json というパス構成についてですが、
  • "servers"ディレクトリがコレクションのようなもの
  • "web1.json"がコレクション内の1アイテム
と理解しておけばよいみたいです。

レシピから呼び出すときは、data_bag_item(コレクション名, アイテムのID) でアイテムを取得できます。
item = data_bag_item('servers','web1')
なお、web1.jsonの中に "id":"web1" などと書かれていて記述がDRYじゃないのが気になりますが、どうもこういうものみたいです。
カテゴリ:

人気記事