Кукольный: перебрать hiera_hash в шаблоне

У меня есть это в файле yaml hiera.

reg_connection:
  toronto:
    - host: apple.net
    - port: 701
    - user: george
    - ssl: true
    - allowed: banana,orange
  texas:
    - host: pink.net
    - port: 702
    - user: joel
    - ssl: false
    - allowed: blue,gree,red

Я хочу получить доступ к значениям хоста, порта, пользователя, ssl и разрешено для Торонто и Техаса.

У меня есть это в моем манифесте:

 $reg_connection= hiera_hash('reg_connection')

У меня есть это в моем шаблоне:

<% reg_connection.keys().sort.each do |location| -%>
<%= location %>host=<%= location[host] %>
<%= location %>port=<%= location[port] %>
<%= location %>username=<%= location[user] %>
<%= location %>ssl.enable=<%= location[ssl] %>
<%= location %>allowed.list=<%= location[allowed] %>
<% end -%>

Я хочу, чтобы это вывело два блока конфигурации в мой шаблон: один для Торонто и один для Техаса.

Мой вывод кукол показывает, что он не имеет значения для хоста. Как я могу получить доступ к этому значению?

1 ответ

Решение

У вас есть ряд проблем. Первое, что в этом коде:

<%= location[host] %>

...host (правильно) интерпретируется как локальная переменная или имя метода. Там нет переменной или метода с именем hostотсюда и ошибка.

Вы хотите получить доступ к значению с ключом "host", которая является строкой, поэтому вы должны использовать эту строку.

<%= location["host"] %>

Вторая проблема в вашем файле YAML.

reg_connection:
  toronto:
    - host: apple.net
    - port: 701
    - user: george
    - ssl: true
    - allowed: banana,orange
  texas:
    # ...

Здесь у вас есть отображение (которое похоже на и разбирается на хэш Ruby) с одним ключом, reg_connection, Значение, связанное с этим ключом, само является отображением с двумя ключами, toronto а также texas, Все идет нормально. Но значение, связанное с toronto является последовательностью (читай: массив), а не отображением, потому что каждая строка начинается с -, Отображение имеет пять элементов, каждый из которых имеет один ключ и значение. Это еще один способ представления той же структуры данных, который может помочь проиллюстрировать проблему;

{ reg_connection:
  { toronto:
    [ { host: apple.net },
      { port: 701 },
      { user: george },
      # ...
    ],
    texas:
      # ...
  }
}

Я подозреваю, что вы хотите, чтобы эта самая внутренняя структура данных была отображением, а не последовательностью:

reg_connection:
  toronto:
    host: apple.net
    port: 701
    user: george
    ssl: true
    allowed: banana,orange
  texas:
    # ...

Третья проблема связана с тем, как вы пытаетесь перебрать получившиеся хеши:

<% reg_connection.keys().sort.each do |location| -%>
<%= location %>host=<%= location["host"] %>
<%= location %>port=<%= location["port"] %>
...

Ты звонил reg_connection.keys.sort.each (примечание: в идиоматическом Ruby круглые скобки опущены для пустых списков аргументов), что означает, что вы не перебираете местоположения, вы перебираете ключи reg_connection хэш. Другими словами, вы перебираете массив ["toronto", "texas"]поэтому следующая строка эквивалентна"toronto"["host"], который не будет работать.

Вы могли бы заменить location["host"] с reg_connection[location]["host"], но это излишне. Просто сделай это:

<% reg_connection.sort.each do |location, values| -%>
<%= location %>host=<%= values["host"] %>
<%= location %>port=<%= values["port"] %>
...

Там нет необходимости получать reg_connectionключи перед звонком sort- вы можете просто вызвать его прямо в хеше. Это, по сути, преобразует хеш в массив пар ключ-значение (двухэлементные массивы), которые Ruby без проблем сортирует. Тогда когда мы позвоним each два значения передаются в блокlocation (они ключ, например, "toronto") а также values хеш с "host", "port"и т. д. ключи.

Другие вопросы по тегам