Ruby,解析YAML并输出值
Ruby, parsing YAML and outputting value
我是 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 的值,我该怎么做呢?
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}]
我是 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 的值,我该怎么做呢?
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}]