我在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到想要的输出表单(而不是map
ping然后filter
ping结果(:
$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
}
}