Кукольный: перебрать 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"
и т. д. ключи.