Isso fará o truque:
yml_string = YAML::dump(node['cfn']['environment'].to_hash)
Eu tenho uma receita de chef onde eu quero pegar todos os atributos em node ['cfn'] ['environment'] e gravá-los em um arquivo yml. Eu poderia fazer algo assim (funciona bem):
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
Mas não gosto de ter que listar explicitamente os nomes dos atributos. Se mais tarde eu adicionar um novo atributo, seria legal se ele fosse incluído automaticamente no arquivo yml gravado. Então eu tentei algo assim:
yml_string = node['cfn']['environment'].to_yaml
Mas como o nó é realmente um Mash, eu recebo um arquivo platform.yml como este (ele contém muitos ninhos inesperados que eu não quero):
--- !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
...
Mas o que eu quero é isso:
----
reporting_prefix: Platform2
signal_url: https://cloudformation-waitcondition-us-east-1.s3.amazonaws.com/...
environment_class: Dev
node_id: i-908adf9
Como posso alcançar a saída desejada do yml sem explicitamente listar os atributos pelo nome?
Isso também funciona e melhor estilo rubi:
yml_string = node['cfn']['environment'].to_hash.to_yaml