Ruby
如何使用 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
我無法使用模板資源實現此結果,因為它在每次循環迭代時都會寫入配置文件(不附加它),結果我只得到最後一個字元串。
生成上述配置文件的最佳方法是什麼?
你可以使用 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下。您可以使用現有庫的方法獲得所需的結果。