You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)生成的是字典类型,符合dict lookup的输入要求;
  • 经过dictsort过滤后,输出变成嵌套列表(每个元素是[键, 值]格式),而dict lookup仅接受字典作为输入,因此触发错误。

正确用法分为两种场景:

场景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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 01:26:14