假设我有一个PIP地图:
pips:
dispy: "4.9.1"
psutil: "latest"
pyodbc: "latest"
foo: "absent"
并希望使用Ansible pip-module安装/升级/删除它们。
如何仅过滤pips
中名称设置为latest
的名称?
更新:使用@techraf的配方,我可以得出以下结论:
- name: Install PIPs by explicit versions
pip:
name: "{{ item }}"
executable: "{{ pip }}"
version: "{{ pips[item] }}"
loop: >-
{{ pips | dictsort | rejectattr(1, 'in', '["latest", "absent"]') | map('first') | list }}
- name: Upgrade or remove other PIPs as prescribed
pip:
name: "{{ item }}"
executable: "{{ pip }}"
state: "{{ pips[item] }}"
loop: >-
{{ pips | dictsort | selectattr(1, 'in', '["latest", "absent"]') | map('first') | list }}
这是可行的,但并不令人满意-因为原始的pips
映射是使用dictsort
转换为另一个对象,然后又转换为list
的。而且,任务的每个实例仍然需要查找该值(以设置version
或state
子句)以执行该操作……
必须有更好的方法...
答案 0 :(得分:1)
例如:
{{ pips | dictsort | selectattr(1, 'equalto', 'latest') | map('first') | list }}
产生一个列表:
[
"psutil",
"pyodbc"
]