Ruby,解析YAML并输出值

时间:2018-01-05 16:00:08

标签: ruby yaml inspec

我对ruby很新,关于这个主题的所有文档都让我感到困惑。所以这里。

我使用inspec测试我的基础架构,但我希望它使用ansible使用的YAML文件中的一些变量。这实际上意味着我可以从ansible代码共享变量并在ruby中使用它们。

YAML文件如下所示:

- name: Converge
  hosts: all
  vars:
    elasticsearch_config:
      cluster.name: "{{ elasticsearch_cluster_name }}"
      node.name: "es-test-node"
      path.data: "/var/lib/elasticsearch"
      path.logs: "/var/log/elasticsearch"
    elasticsearch_cluster_name: test
  pre_tasks:
  roles:
    - elasticsearch
  post_tasks:

此时,我正在玩ruby代码来提取它,并且有:

require 'yaml'

parsed = begin
  YAML.load(File.open("../../playbook.yml"))
rescue ArgumentError => e
  puts "Could not parse YAML: #{e.message}"
end

puts parsed

哪个输出哈希:

{"name"=>"Converge", "hosts"=>"all", "vars"=>{"elasticsearch_config"=>{"cluster.name"=>"{{ elasticsearch_cluster_name }}", "node.name"=>"es-test-node", "path.data"=>"/var/lib/elasticsearch", "path.logs"=>"/var/log/elasticsearch"}, "elasticsearch_cluster_name"=>"test"}, "pre_tasks"=>nil, "roles"=>["elasticsearch"], "post_tasks"=>nil}

到目前为止一切顺利。这一切都对我有意义。现在,我想从这些数据中提取值,并在ruby代码中使用它们,通过键引用它们。所以,如果我想获得vars.elasticsearch_config.node.name的值,我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

YAML.load将文档读入数组,因此您必须获取示例中的第一个元素:

loaded_yaml[0]["vars"]["elasticsearch_config"]["node.name"]

原因是您要解析的文档以单个破折号开头,表示列表项。即使列表中只有一个项目,Psych(您的YAML引擎)仍将其放入表示列表的数组中。这也是您遇到no implicit conversion of String to Integer错误的原因。请注意,您得到的响应用方括号括起来:

 => [{"name"=>"Converge", "hosts"=>"all", "vars"=>{"elasticsearch_config"=>{"cluster.name"=>"{{ elasticsearch_cluster_name }}", "node.name"=>"es-test-node", "path.data"=>"/var/lib/elasticsearch", "path.logs"=>"/var/log/elasticsearch"}, "elasticsearch_cluster_name"=>"test"}, "pre_tasks"=>nil, "roles"=>["elasticsearch"], "post_tasks"=>nil}]