如何在Ansible中查找列表成员身份
我有一个列表,我想用它来查看列表中的任何成员是否在第二个列表中,并在Ansible如何在Ansible中查找列表成员身份,ansible,ansible-playbook,Ansible,Ansible Playbook,我有一个列表,我想用它来查看列表中的任何成员是否在第二个列表中,并在Ansiblewhen子句中使用它。这可以在一个班轮内完成吗 - name: task include moar ansible include: more_tasks.yaml when: any_member_of_this_list in some_other_list 我相信有一种方法可以在一个游戏中使用许多花哨的jinja2命令来实现这一点,但是使用自己的自定义插件可能不会让你发疯。如果在保存ansible脚
when
子句中使用它。这可以在一个班轮内完成吗
- name: task include moar ansible
include: more_tasks.yaml
when: any_member_of_this_list in some_other_list
我相信有一种方法可以在一个游戏中使用许多花哨的jinja2命令来实现这一点,但是使用自己的自定义插件可能不会让你发疯。如果在保存ansible脚本的文件夹的根目录中创建“filter_plugins”目录,ansible将自动找到它们。这是我的“filter\u plugins/contains\u any.py”文件:
# lambda gratefully 'borrowed' from:
# https://stackoverflow.com/questions/10668282/one-liner-to-check-if-at-least-one-item-in-list-exists-in-another-list
contains_any = lambda a, b: any(i in b for i in a)
class FilterModule(object):
def filters(self):
return {
'contains_any': contains_any
}
在您的剧本中,您可以使用“set_fact”模块根据列表之间是否存在任何匹配来设置真/假值。当您将“the_list”导入“contains_any”时,它会自动将“the_list”设置为第一个变量,因此您只需显式传递“the_other_list”:
---
- hosts: localhost
vars:
the_list: [jane, bill, janet, suzy]
the_other_list: [jane, steve, bob, sam, turkey]
tasks:
- set_fact:
any_matches: "{{ the_list | contains_any(the_other_list) }}"
- debug: msg="Success!"
when: any_matches
以下是输出:
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [localhost]
TASK [set_fact] ****************************************************************
ok: [localhost]
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "Success!"
}
PLAY RECAP *********************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0
编辑:多亏了lambda函数这非常简单。Ansible,其中一个是
intersect
,它返回包含在两个列表中的唯一元素。由于空列表是虚假的,非空列表是真实的,因此没有比这更多的事情要做:
when: any_member_of_this_list | intersect(some_other_list)
您只需要一个花式jinja过滤器。:)我认为lambda函数的作用与
intersect
过滤器的作用完全相同。看看我的另一个答案。这是一把大锤子,但现在我知道如何处理更复杂的东西了。谢谢你的回答。@Randy Hah!是的,肯定是一个大锤子,特别是考虑到udondan的一个衬里,但是知道构建自定义过滤器非常容易,这绝对是件好事。我要试试这个。谢谢