2016-07-17 3 views
0

У меня есть это в файле yaml hiera.Кукольный: Iterate через hiera_hash в шаблоне

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 и разрешено для toronto и texas.

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

$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 -%> 

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

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

+0

Обратите внимание, что точка 'hiera_hash()' предназначена для выполнения поиска * hash-merge *. Данные и результаты обязательно являются хешами, но только потому, что ваше значение, как ожидается, будет хешем, не означает, что вам нужно или нужно 'hiera_hash()'. Обычная функция 'hiera()' вместо этого выполняет стандартный поиск по приоритету, и она вернет хэш, если это фактически тип значения, которое он обнаруживает. –

ответ

6

У вас есть ряд проблем. Во-первых, в этом коде:

<%= location[host] %> 

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

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

<%= location["host"] %> 

Вторая проблема заключается в вашем файле YAML.

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

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

{ 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 «S ключи перед вызовом sort -вы можете просто назвать его непосредственно на хэш. Фактически это преобразует хэш в массив пар ключ-значение (двухэлементные массивы), которые Ruby не имеет проблем с сортировкой. Затем, когда мы вызываем each, два значения передаются в блок location (они, например, "toronto") и values, хэш с "host", "port" и т. Д. Ключей.

+0

очень дидактический. Большое спасибо. – RASG

Смежные вопросы