Chef/初心者向けChef入門講座/databagでユーザー作成


databagでユーザー作成

Chefでユーザー作成する時のレシピはこんな感じですね。
user "hoge" do
  supports :manage_home => true
  action :create
end
ただし、これだとユーザーが増えるたびに同じレシピをどんどん増やしていくことになってしまって気持ち悪いです。

なのでこんな感じにしてみます。
["hoge", "hage", "moge"].each do |name|
  user name do
    supports :manage_home => true
    action :create
  end
end
これはこれで気持ち悪いですね。
せっかくアトリビュートが使えるので外出ししましょう。

アトリビュートをこんな感じに。
default["user"]["users"] = ["hoge", "hage", "moge"]

レシピはこんな感じですね。
node["user"]["users"].each do |name|
  user name do
    supports :manage_home => true
    action :create
  end
end

ユーザー名を使ってユーザー作成するだけならこれでもいいかもしれませんが、もっと登録しなければならない項目が増えた場合はどうなるでしょう。
例えばパスワードを指定する場合はこんな感じでしょうか。

アトリビュートはこんな感じ。
default["user"]["users"] = [ { :name => "hoge", :pass => "hogege" }, { :name => "hage", :pass => "hagege" }, { :name => "moge", :pass => "mogege" } ]

レシピはこんな感じ。
node["user"]["users"].each do |account|
  user account[:name] do
    password account[:pass]
    supports :manage_home => true
    action :create
  end
end
レシピはともかくとしてアトリビュートの複雑さが増してますね。
もっと大量のデータになったら大変そうです。

これをdatabagに対応させるにはこうします。
まずdatabagのディレクトリを作ります。
$ mkdir ~/chef/data_bags

~/.chef/knife.rbにパスを書いておきます。
data_bag_path "/home/chefuser/chef/data_bags"

任意の識別名でサブディレクトリを作ります。
今回はユーザー情報を格納するのでuserとでもしておきましょう。
$ mkdir ~/chef/data_bags/user

ユーザー情報を格納するjsonフォーマットのファイルを作成します。
このファイルは1ファイルにつき1オブジェクトを記述します。
とりあえず~/chef/data_bags/user/hoge.jsonを下記の様に作ります。
{
  "id": "hoge",
  "pass": "hogege"
}
同様にhage.jsonとmoge.jsonも作っておいて下さい。
なお後程使っていきますが、idには特殊な意味があって必須かつユニークでなければなりません。

ではレシピを作ります。
こんな感じです。
ids = data_bag('user')
ids.each do |id|
  user id do
    object = data_bag_item('user', id)
    password object["pass"]
    supports :manage_home => true
    action :create
  end
end
レシピ自体はそんなに大きくは変わってませんね。

では解説していきます。
まず1~2行目です。
ids = data_bag('user')
ids.each do |id|
data_bagメソッドにdata_bag名を与えるとdata_bagディレクトリ配下の.jsonファイルが全て読み込まれ、有効な全てのIDを格納した配列が取得できます。
つまり、 data_bag('user') によってdata_bag/user/*.jsonの中のjsonファイルが読み込まれて全IDの配列を返します。
その配列に対して each do でループさせている形です。

続けて3行目からは普通にuserリソースの作成をしてます。
ここではeach doの所で出てきたid、つまりjsonファイル内で記述したユーザー名を渡しています。
user id do

そして4~5行目です。
object = data_bag_item('user', id)
password object["pass"]
data_bag_itemメソッドの引数にdata_bag名とidを与えると、そのオブジェクト自体を取得できます。
ここで使うのはパスワード文字列なので、pass の連想配列キーを使ってパスワードデータを取り出しました。

後は同じなので割愛します。

さて、databagの使い勝手はどうだったでしょうか。
レシピ自体はそれほど変わらないですが、アトリビュートがゴチャゴチャしなくて済みました。
そしてアトリビュートにデータを記述するのと異なり、データが特定のクックブックに依存せずに管理できるようになりました。
これは、どんなレシピからでも同じ記述で同じデータが扱えるということです。
うまく使えばデータ管理が楽になりますね。



参考サイト




  • 最終更新:2016-01-19 13:41:34

このWIKIを編集するにはパスワード入力が必要です

認証パスワード