木偶中的动态列表?

木偶中的动态列表?

我正在使用 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

相关内容