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}]
Другие вопросы по тегам