2017-01-26 14 views
1

Мы используем кукольный 3.8 (к сожалению, не может перейти к марионетке 4 пока)Кукол - итерация над хэш

У меня есть хэш в hiera, который выглядит примерно так:

hash_data: 
    item1: 
    field1: 'some data' 
    array_data: 
     - data1 
     - data2 
    item2: 
    field1: 'other data' 
    array_data: 
     - data3 
     - data4 

Я соединил модуль с кодом что-то вроде:

class processor { 
    $data = hiera_hash('hash_data', {}) 

    create_resources(processor::hash_entry, $data) 
} 

define processor::hash_entry ($field1, $array_data) { 
# .. do_something .. 

# process array items 
    processor::process_array { $array_data : 
     datavar = 'somevalue' 
    } 
} 

define processor::process_array($element, $datavar) { 
    # do something 
} 

это прекрасно работает до тех пор, на полях array_data в хэш все содержат уникальные поля. Однако, если мне нужно поставить не уникальные данные примерно так:

hash_data: 
    item1: 
    field1: 'some data' 
    array_data: 
     - data1 
     - data2 
    item2: 
    field1: 'other data' 
    array_data: 
     - data3 
     - data2     (**non-unique value **) 

затем мы попали в дубликат ресурса. Может ли кто-нибудь предложить, как я могу обработать этот хеш?

Благодаря

+0

Результат, который вы хотите, неясен. Если в YAML дважды задан 'data2', вы хотите только один раз или два определить« Processor :: ProcessArray [data2] »? Должен ли он быть пропущен, если он уже определен, или он должен быть определен однозначно основанным также на процессоре :: hash_entry name? –

+0

@ DominicCleal - извинения, должно быть, было яснее. Я бы хотел, чтобы записи обрабатывались как уникальные экземпляры. – SimonH

ответ

1

Проблема начинается здесь, где processor::process_array дается неуникальными данные как название:

define processor::hash_entry ($field1, $array_data) { 
    processor::process_array { ${array_data}: 
     # ... 

Когда processor::hash_entry вызывается дважды с перекрытием/идентичными array_data, это создает:

Processor::Process_array[data1] 
Processor::Process_array[data2] 
Processor::Process_array[data3] 
Processor::Process_array[data2] 

, который, я думаю, является дублирующимся ресурсом, который вы сообщаете.

Если вы префикс это с уникальными данными, то есть "item1"/"item2" имя ресурсов processor::hash_entry (или поле 1, если необходимо), то они будут уникальными.

Использование функции stdlib prefix(), префикс всех данных * записи с именем hash_entry:

define processor::hash_entry ($field1, $array_data) { 
    $prefixed_array_data = prefix($array_data, "${title}-") 
    processor::process_array { ${prefixed_array_data}: 
     # ... 

Это будет генерировать:

Processor::Process_array[item1-data1] 
Processor::Process_array[item1-data2] 
Processor::Process_array[item2-data3] 
Processor::Process_array[item2-data2] 

Если вам необходимо получить доступ к значению data2 внутри process_array без префикса то вы можете всегда split$title, чтобы получить данные обратно.

define processor::process_array($element, $datavar) { 
    $split_title = split($title, '-') 
    $data = $split_title[1] 
    # do something 
} 
+0

Мы не можем развернуть полный stdlib по разным причинам, но поместив функцию префикса в модуль, позвольте мне сделать то, что мне нужно! – SimonH