如何在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脚

我有一个列表,我想用它来查看列表中的任何成员是否在第二个列表中,并在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的一个衬里,但是知道构建自定义过滤器非常容易,这绝对是件好事。我要试试这个。谢谢