LoginSignup
64
65

More than 5 years have passed since last update.

Chefのtemplateにrecipeからデータを渡すvariablesについて

Last updated at Posted at 2013-02-26

検証環境
Chef v11.4.0

Chefにて、同じcookbookを使い、異なった複数の値を与えて
結果を異なったファイルに出力する場合は、variablesを利用する。

当初、この課題に対する解決方法として、
複数の role を作成し、その role 内で異なった値をJSONに入れることにより
実現できると思い込んでいたのだが、run_listでは複数のrecipeとして理解されず、
複数のroleで同じcookbookを利用した場合には後者のみが採用され、
最初に読み込まれた role は認識されなかった。

variablesを利用したレシピをみていこう

JSONには ports というkeyに対して、"6379"と"6380"という複数のvalueをもたせる

redis.json
{
    "redis": {
       "ports": [
         "6379", "6380"
       ]
    },
   "run_list": [
      "recipe[redis]"
   ]
}

recipe内で
ports.each do |port|と分解して実行するように記述する
また、わかりづらいのだが

    variables({
      :port => port
    })

このように port 、この場合でいえば "6379" 、 "6380" の値を
@port に代入している。

/redis/cookbook/recipe/default.rb

package "redis"

### 色々

directory "/etc/redis" do
  owner "redis"
  mode  0644
end

ports.each do |port| ### portsを分解して実行させる

  template "/etc/redis/#{port}.conf" do
    owner "root"
    mode  0644
    source "redis.conf.erb"

    variables({
      :port => port  ### ここで代入している
    })
  end

end

template内で、代入された @port を利用する

cookbooks/redis/templates/default/redis.conf.erb

pidfile /var/run/redis_<%= @port %>.pid

port <%= @port %>
logfile /var/log/redis/redis_<%= @port %>.log
dir /var/lib/redis/<%= @port %>

上記内容の結果、出力ファイルとして

/etc/redis/6379.conf
pidfile /var/run/redis_6379.pid

port 6379
logfile /var/log/redis/redis_6379.log
dir /var/lib/redis/6379
/etc/redis/6380.conf
pidfile /var/run/redis_6380.pid

port 6379
logfile /var/log/redis/redis_6380.log
dir /var/lib/redis/6380

期待した通り、複数のvalueを受け取り
それぞれ異なったファイルに出力されることが確認できた。

もう少しエレガントな方法があるように思うので
他の方法などがあれば、是非是非コメントを頂きたい。

64
65
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
64
65