Назад | Перейти на главную страницу

Как создать хэш или yml из значений атрибутов верхнего уровня узла?

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