Ruby

如何使用 Chef 從節點屬性(數組)生成配置文件?

  • February 3, 2012

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

我無法使用模板資源實現此結果,因為它在每次循環迭代時都會寫入配置文件(不附加它),結果我只得到最後一個字元串。

生成上述配置文件的最佳方法是什麼?

你可以使用 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 中的,因為在管理系統狀態時,管理文件的全部內容會更好、更可靠。如果模板的內容在另一本食譜的其他地方被修改,請考慮為什麼會這樣,以及合併食譜是否明智。

您還可以使用一個漂亮的功能來“重新打開”已定義的資源 - 該resources方法可用於選擇特定資源。非常基本的例子:

也就是說,Chef::Util::FileEdit該類有許多用於管理內容的輔助方法。最初實現該功能的票證是CHEF-78。由於我上面提到的原因,它沒有記錄(抱歉)。如果該庫不存在,則有一個更新檔可以進一步擴展該庫以附加一行,該行位於票據CHEF-2740下。您可以使用現有庫的方法獲得所需的結果。

引用自:https://serverfault.com/questions/355705