如何使用 Chef 从节点属性(数组)生成配置文件?

如何使用 Chef 从节点属性(数组)生成配置文件?

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。您也许能够用现有库的方法实现您想要的结果。

相关内容