我正在使用 puppet(版本 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
,因为您无法像在 puppet 4.x 中hiera
那样调用。scope.function_hiera