我正在寻找一种最简单的方法来检查列表中的所有元素是否在Ansible中的另一个较大列表中。
检查['pkg_mgr', 'python']
中是否同时存在ansible_facts
的示例。
答案 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())
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
}