Я использую марионетку (версия 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.