假设您有一个字典数组,并且您想构建一个包含一些字典属性的数组。 有几种方法可以做到这一点: selectattr、map和新的提取过滤器。
在您决定将某个组的主机用作字典的初始数组之前,这非常有效。 因此,您必须使用过滤器为组中的每个主机获取hostvars
。 我们通常可以通过一些 jinja 迭代来解决这个问题,但这不适用于设置变量。
也就是说有一个解决方案:
def fetchlistfromdict(d, l):
result = []
for item in l:
result.append(d[item])
return result
class FilterModule(object):
def filters(self):
return {
'fetchlistfromdict': fetchlistfromdict,
}
现在:
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
这种情况似乎非常具体,可能与route53
模块有关。
那么我们可以将这个过滤器添加到 ansible 中吗? 我要不要做PR? 取名呢? 我保存了原始的,但list_from_dict
对我来说看起来更好。
{{ hostvars|fetchlistfromdict(groups['webservers']) |map(attribute='custom_facts.aliases.0.ip')|list}}
这与有什么不同
{{ groups['webservers']|map('extract', hostvars, ['custom_facts','aliases','0','ip'])|list }}
?
@amenonsen好点,我只尝试使用map(attribute=
来获得它,看起来新的提取过滤器可以完成这项工作,期待在新版本中使用它!
此示例应包含在文档中。 在发现这个问题之前,我搜索了很长时间。
最有用的评论
此示例应包含在文档中。 在发现这个问题之前,我搜索了很长时间。