Chef 节点的属性之一是哈希数组:
"array_of_hashes": [
{
"hash_key_1": "value1",
"hash_key2": "value2",
},
{
"hash_key_2": "value4",
"hash_key_1": "value3",
}
]
我需要循环遍历每个数组元素并生成一个配置文件,其中模板参数由哈希中的值定义:
# cat my_config.conf
key1=value1; key2=value2
key1=value3; key2=value4
我无法使用模板资源,因为它在每个循环迭代中都写入配置文件(不附加它),因此我只得到最后一个字符串。
生成上述配置文件的最佳方法是什么?
答案1
您可以使用 bash block 吗?
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
加上无论循环、条件等等,您都需要使其工作。
答案2
严格来说,这并不是 Chef 内置的库或任何资源的功能,因为在管理系统状态时,管理文件的全部内容会更好、更可靠。如果模板的内容在另一个食谱的其他地方被修改,请考虑原因,以及合并食谱是否合理。
您还可以使用一个巧妙的功能来“重新打开”已定义的资源 - 该resources
方法可用于选择特定资源。非常基本的示例:
尽管如此,该类Chef::Util::FileEdit
有许多用于管理内容的辅助方法。最初实现该功能的票证是CHEF-78。由于我上面提到的原因,它没有记录(抱歉)。有一个补丁可以进一步扩展此库以在不存在时添加一行,该补丁位于票证下CHEF-2740。您也许能够用现有库的方法实现您想要的结果。