我正在使用puppet(版本4.x,其中2 <= x <= 8)来configuration系统。 我有许多由Hiera提供的variables,每个variables都包含一个组列表。 input数据如下所示:
project1_groups: - group1 - group2 project2_groups: - group2 - group3 project3_groups: - group2 - group4
从这里,我需要build立一个我可以传递给user资源的单一列表。 从概念上讲,我想要:
$groups = project1_groups + project2_groups + project3_groups user { 'someuser': groups => $groups }
换句话说,从上面的input数据我想要得到一个可能看起来像这样的组列表:
[group1, group2, group2, group3, group2, group4]
傻瓜是好的,名单不一定是唯一的。
但是有一个并发症! 诀窍是我不知道可用的project*_groupsvariables。 我有一个variables$projects ,在上面的例子中将包含列表[project1, project2, project3] 。
我想出了一个基于inline_template的解决scheme,虽然工作起来,但看起来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调用。