Назад | Перейти на главную страницу

Динамические списки в марионетке?

Я использую марионетку (версия 4.x, где 2 <= x <= 8) для настройки системы. У меня есть несколько переменных, предоставленных Hiera, каждая из которых содержит список групп. Входные данные выглядят примерно так:

project1_groups:
  - group1
  - group2

project2_groups:
  - group2
  - group3

project3_groups:
  - group2
  - group4

Исходя из этого, мне нужно составить единый список групп, который я могу передать в user ресурс. Концептуально я хочу:

$groups = project1_groups + project2_groups + project3_groups
user { 'someuser':
  groups => $groups
}

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

[group1, group2, group2, group3, group2, group4]

Дубликаты в порядке, список не обязательно должен быть уникальным.

Но есть осложнение! Хитрость в том, что я заранее не знаю доступных project*_groups переменные. У меня есть переменная $projects что в приведенном выше примере будет содержать список [project1, project2, project3].

Я придумал inline_template решение на основе, которое работает, но кажется хакерским; Мне интересно, есть ли лучший способ сделать это:

include stdlib

# get the list of project names
$projects = hiera('projects')

# this is a list of default groups. It might be undefined.
$default_groups = undef

# create a comma-delimited list of groups
$groups_string = inline_template('<% @projects.each do |prj|
    -%><% scope.call_function("hiera",
        [prj + "_groups", []]).each do |grp|
    -%><%= grp %>,<% end -%><% end -%>')

# start with a (possibly nil) list of default groups
$_groups = any2array($default_groups)

# split comma-delimited string, concatenate it with default groups,
# and remove empty groups (which you get if $default_groups is nil).
$groups = concat($_groups, $groups_string.split(',')).filter |$grp| {$grp != ''}

Заметка Обновлено для использования scope.call_function, так как ты не можешь позвонить hiera так как scope.function_hiera в марионетке 4.x.