如何仅选择值满足条件的映射键?

时间:2018-08-15 23:51:59

标签: ansible jinja2

假设我有一个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的。而且,任务的每个实例仍然需要查找该值(以设置versionstate子句)以执行该操作……

必须有更好的方法...

1 个答案:

答案 0 :(得分:1)

例如:

{{ pips | dictsort | selectattr(1, 'equalto', 'latest') | map('first') | list }}

产生一个列表:

[
    "psutil",
    "pyodbc"
]