主厨节点的属性之一是散列数组:
"array_of_hashes": [ { "hash_key_1": "value1", "hash_key2": "value2", }, { "hash_key_2": "value4", "hash_key_1": "value3", } ]
我需要遍历每个数组元素,并生成一个configuration文件,其中模板参数由散列值定义:
# cat my_config.conf key1=value1; key2=value2 key1=value3; key2=value4
我无法使用模板资源来实现这个结果,因为它在每个循环迭代中都不支持configuration文件(不附加它),而我只得到最后一个string。
生成上述configuration文件的最好方法是什么?
你可以使用bash块吗?
http://wiki.opscode.com/display/chef/Resources#Resources-Script
所以,像这样的:
bash "append_to_config" do user "root" cwd "/path/to/config/directory" code <<-EOH echo "#{node[:array_of_hashes][:hash_key]}=#{node[:array_of_hashes][:hash_value]}" > my_config.conf EOH end
再加上任何循环,条件等,你需要做的工作。
这并不是Chef作为图书馆或任何资源的特征而被严格构build的,因为当pipe理系统状态时,pipe理文件的全部内容是更好和更可靠的。 如果模板的内容在另一本食谱中的其他地方被修改过,请考虑为什么是这样,以及是否可能合并食谱。
您还可以使用一个漂亮的function“重新打开”一个定义的资源 – resources方法可以用来select特定的资源。 非常基本的例子:
也就是说, Chef::Util::FileEdit类有许多用于pipe理内容的辅助方法。 最初实现该function的票是CHEF-78 。 由于我上面提到的原因,没有logging(遗憾)。 有一个补丁可以进一步扩展这个库,如果不存在的话,这个库在CHEF-2740之下。 您可以使用现有库的方法来获得所需的结果。