使用Ansible检查列表中的所有元素是否存在于另一个列表中

时间:2020-02-07 10:16:30

标签: ansible jinja2

我正在寻找一种最简单的方法来检查列表中的所有元素是否在Ansible中的另一个较大列表中。

检查['pkg_mgr', 'python']中是否同时存在ansible_facts的示例。

3 个答案:

答案 0 :(得分:2)

when: "{{ ['pkg_mgr', 'python'] | difference(ansible_facts.keys()) | length == 0 }}"

Q:“我对它的丑陋程度感到不满意。我很高兴看到更干净的解决方案。”

A:在Ansible中,空列表的值为False。无需测试列表的长度。默认情况下,Ansible条件when会扩展表达式。不必用大括号将其关闭。等效条件是

when: not ['pkg_mgr', 'python']|difference(ansible_facts.keys())


Python3 返回一个dictionary view object而不是方法dict.keys(), dict.values(), and dict.items()的列表。添加list过滤器以使代码可移植。参见Dictionary Views

when: not ['pkg_mgr', 'python']|difference(ansible_facts.keys()|list)

答案 1 :(得分:1)

我能够找到一个可行的解决方案,但对于它看起来多么丑陋,我感到非常满意。

- when: "{{ ['pkg_mgr', 'python'] | difference(ansible_facts.keys()) | length == 0 }}"
  ...

我很高兴看到更干净的解决方案。

答案 2 :(得分:0)

如何使用is subset

测试:

- name: "Check lists"
  hosts: localhost
  connection: local 
  tasks:
  - debug:
      msg: "{{ ['pkg_mgr', 'python'] is subset(ansible_facts.keys()) }}"
  - debug:
      msg: "{{ ['pkg_mgr', 'python', 'foo'] is subset(ansible_facts.keys()) }}"

输出:

PLAY [Check lists] *****************************************************************************************************************************************************************************************

TASK [Gathering Facts] *************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": true
}

TASK [debug] ***********************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": false
}