У меня есть рецепт от шеф-повара, в котором я хочу взять все атрибуты из узла ['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