web-dev-qa-db-ja.com

ノードのトップレベルの属性値からハッシュまたはymlを作成するにはどうすればよいですか?

Node ['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

しかし、ノードは実際にはマッシュであるため、次のような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出力を実現するにはどうすればよいですか?

5
Sarah Haskins

これでうまくいきます:

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

これも機能し、より良いRuby style:

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

1
sekrett