从Puppet中的哈希数组中提取一个值数组



我在hiera中有以下哈希数组:

corporate_roles:
- name: 'user.1'
system_administrator: true
global_administrator: false
password: TestPassword1234
- name: 'user.2'
system_administrator: true
global_administrator: true
password: TestPassword1234

我需要提取一个具有给定角色(例如global_administrator(的用户列表,以便稍后分配。我设法使用map函数提取了我需要的数据:

$corporate_roles = lookup('corporate_roles')
$global_admins = $corporate_roles.map | $hash | { if ($hash['global']){$hash['name']}}
notify { "global admins are: ${global_admins}":
}

然而,这导致undef值似乎进入了不符合条件的用户的数组:

Notice: /Stage[main]/salesraft_test/Notify[global admins are: [, user.2]]/message: defined 'message' as 'global admins are: [, user.2]'
Notice: Applied catalog in 0.04 seconds

我可以通过使用filter函数来绕过这个问题,如下所示:

$test = $global_admins.filter | $users | {$users =~ NotUndef}

这导致了干净的输出:

Notice: /Stage[main]/salesraft_test/Notify[global admins are: [user.2]]/message: defined 'message' as 'global admins are: [user.2]'
Notice: Applied catalog in 0.03 seconds

但我怀疑一定有更好的方法可以做到这一点,我要么在map中缺少一些逻辑,要么可能为此使用了错误的函数。

我想知道是否有更好的方法来实现我想要做的事情?

但我怀疑一定有更好的方法,我要么我的地图中缺少一些逻辑,或者我可能使用了错误的函数完全是为了这个。

map()为每个输入项只发出一个输出项,因此,如果您的目标是应用单个函数从(更长的(输入中获得所需的输出,那么map实际上无法实现这一点。

我想知道是否有更好的方法来实现我想要做的事情?

就我个人而言,我会通过filter从输入中找出你想要的哈希,然后map将其ping到想要的输出表单(而不是mapping然后filterping结果(:

$global_admins = $corporate_roles.filter |$hash| {
$hash['global_administrator']
}.map |$hash| { $hash['name'] }

我喜欢它,因为它很好,很清晰,但如果你想用一个函数调用而不是两个函数调用,那么你可能正在寻找reduce:

$global_admins = $corporate_roles.reduce([]) |$admins, $hash| {
$hash['global_admin'] ? {
true    => $admins << $hash['name'],
default => $admins
}
}

相关内容

  • 没有找到相关文章

最新更新