Chef

如何從節點的頂級屬性值創建雜湊或 yml?

  • January 18, 2018

我有一個廚師食譜,我想在其中獲取節點下的所有屬性

$$ ‘cfn’ $$$$ ’environment’ $$並將它們寫入 yml 文件。我可以做這樣的事情(它工作正常):

content = {
 "environment_class" => node['cfn']['environment']['environment_class'],
 "node_id" => node['cfn']['environment']['node_id'],
 "reporting_prefix" => node['cfn']['environment']['reporting_prefix'],
 "cfn_signal_url" => node['cfn']['environment']['signal_url']
}

yml_string = YAML::dump(content)

file "/etc/configuration/environment/platform.yml" do
 mode 0644
 action :create
 content "#{yml_string}"
end

但我不喜歡我必須明確列出屬性的名稱。如果稍後我添加一個新屬性,如果它自動包含在寫出的 yml 文件中會很好。所以我嘗試了這樣的事情:

yml_string = node['cfn']['environment'].to_yaml

但是因為節點實際上是一個 Mash,所以我得到一個這樣的 platform.yml 文件(它包含很多我不想要的意外嵌套):

--- !ruby/object:Chef::Node::Attribute
normal:
 tags: []
 cfn:
   environment: &25793640
     reporting_prefix: Platform2
     signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/...
     environment_class: Dev
     node_id: i-908adf9
...

但我想要的是這樣的:

----
reporting_prefix: Platform2
signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/...
environment_class: Dev
node_id: i-908adf9

如何在不按名稱顯式列出屬性的情況下實現所需的 yml 輸出?

這可以解決問題:

yml_string = YAML::dump(node['cfn']['environment'].to_hash)

這也有效並且更好的紅寶石風格:

yml_string = node['cfn']['environment'].to_hash.to_yaml

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