Estou usando o fantoche (versão 4.x, onde 2 < = x < = 8) para configurar um sistema. Eu tenho um número de variáveis fornecidas por Hiera, cada uma contendo uma lista de grupos. Os dados de entrada são parecidos com:
project1_groups:
- group1
- group2
project2_groups:
- group2
- group3
project3_groups:
- group2
- group4
A partir disso, preciso criar uma única lista de grupos que eu possa passar para um recurso user
. Conceitualmente, quero:
$groups = project1_groups + project2_groups + project3_groups
user { 'someuser':
groups => $groups
}
Em outras palavras, a partir dos dados de entrada acima, eu quero obter uma lista de grupos que podem ser parecidos com:
[group1, group2, group2, group3, group2, group4]
Dupes estão bem, a lista não precisa ser exclusiva.
Mas há uma complicação! O truque é que eu não sei de antemão as variáveis project*_groups
disponíveis. Eu tenho uma variável $projects
que no exemplo acima conteria a lista [project1, project2, project3]
.
Eu criei uma solução baseada em inline_template
que funciona mas parece hacky; Eu estou querendo saber se existe uma maneira melhor de fazer isso:
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 != ''}
Observação Atualizado para usar scope.call_function
, pois você não pode chamar hiera
as scope.function_hiera
no fantoche 4.x.
Tags puppet