Ansible:合并两个字典时dictsort过滤器的正确用法
问题描述
测试Playbook如下:
--- - name: Playbook hosts: localhost become: false gather_facts: false vars: first: alpha: 1 gamma: 3 second: beta: 2 tasks: - name: Import facts ansible.builtin.import_role: name: helm tasks_from: facts - name: Debug ansible.builtin.debug: msg: "{{ lookup('ansible.builtin.dict', first | combine(second)) }}"
执行后得到预期的键值对结果:
ok: [localhost] => msg: - key: alpha value: 1 - key: gamma value: 3 - key: beta value: 2
但添加dictsort过滤器后:
msg: "{{ lookup('ansible.builtin.dict', first | combine(second) | dictsort) }}"
出现如下错误:
fatal: [localhost]: FAILED! => msg: 'An unhandled exception occurred while running the lookup plugin ''ansible.builtin.dict''. Error was a <class ''ansible.errors.AnsibleError''>, original message: with_dict expects a dict. with_dict expects a dict'
请问dictsort过滤器的正确用法是什么?
原因分析与正确用法
错误根源是dictsort的输出类型和ansible.builtin.dict lookup插件的输入要求不匹配:
first | combine(second)生成的是字典类型,符合dictlookup的输入要求;- 经过
dictsort过滤后,输出变成嵌套列表(每个元素是[键, 值]格式),而dictlookup仅接受字典作为输入,因此触发错误。
正确用法分为两种场景:
场景1:保留lookup输出的key/value字典格式并排序
将dictsort放在lookup结果之后,对lookup输出的列表进行排序:
- name: Debug sorted (method 1) ansible.builtin.debug: msg: "{{ lookup('ansible.builtin.dict', first | combine(second)) | dictsort('key') }}"
执行结果(按键排序):
ok: [localhost] => msg: - key: alpha value: 1 - key: beta value: 2 - key: gamma value: 3
场景2:直接对字典排序后输出
dictsort处理字典后返回[键, 值]的嵌套列表,直接输出即可,无需使用dict lookup:
- name: Debug sorted (method 2) ansible.builtin.debug: msg: "{{ (first | combine(second)) | dictsort }}"
输出格式为嵌套列表:
ok: [localhost] => msg: - - alpha - 1 - - beta - 2 - - gamma - 3
如果需要和lookup输出的key/value格式一致,可搭配items2dict过滤器转换:
- name: Debug sorted with key/value format (method 2 enhanced) ansible.builtin.debug: msg: "{{ ((first | combine(second)) | dictsort) | items2dict(key_name='key', value_name='value') }}"
输出结果与场景1完全相同。
内容的提问来源于stack exchange,提问作者Floren
相关产品推荐
相关产品推荐

