Ruby, разбор YAML и вывод значения
Я довольно новичок в ruby, и вся документация на эту тему немного смутила меня. Так что здесь идет.
Я использую inspec для проверки своей инфраструктуры, но я хочу, чтобы она использовала некоторые переменные из файла YAML, используемого ansible. Это фактически означает, что я могу делиться переменными из ANSI-кода и использовать их в 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 ответ
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}]