Como criar hash ou yml de valores de atributos de nível superior do nó?

5

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?

    
por Sarah Haskins 18.10.2012 / 18:22

2 respostas

5

Isso fará o truque:

yml_string = YAML::dump(node['cfn']['environment'].to_hash)
    
por 18.10.2012 / 18:58
1

Isso também funciona e melhor estilo rubi:

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

    
por 01.06.2016 / 15:22