Ruby
chef

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

More than 5 years have passed since last update.


検証環境

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を受け取り

それぞれ異なったファイルに出力されることが確認できた。

もう少しエレガントな方法があるように思うので

他の方法などがあれば、是非是非コメントを頂きたい。