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

Ansible difference过滤器未按预期显示两个列表的差异

问题排查:Ansible difference过滤器未正确返回数据库差异列表

问题根源

你的query_result是字典列表(每个元素为{"datname": "数据库名"}格式),而dbs是纯字符串列表。difference过滤器仅能对比相同类型的元素,类型不匹配时会判定所有元素均不相同,因此返回服务器上的全部数据库。

解决方案

先通过map(attribute='datname')提取query_result中的数据库名字段,转换成纯字符串列表后再执行对比操作。

修正后的Playbook

vars: 
  dbs:
  - database1
  - database2

tasks:

- name: collect a list of all databases currently on the server
  postgresql_query:
    db: postgres
    query: "select datname from pg_database where not datistemplate and datname <> 'postgres';"
  delegate_to: database_server.fqdn
  become_user: postgres
  register: all_databases_on_server

- name: what is the difference
  ansible.builtin.debug:
    msg: "{{ all_databases_on_server.query_result | map(attribute='datname') | list | difference(dbs) }}"

验证说明

修正后,map(attribute='datname')会将query_result的字典列表转换为["database1", "database2", "database3"],再与dbs对比,difference就能正确返回["database3"]。

原任务输出参考

{
   "query_all_results": [
        [
            {
                "datname": "database1"
            },
            {
                "datname": "database2"
            },
            {
                "datname": "database3"
            }
        ]
    ],
    "query_list": [
        "select datname from pg_database where not datistemplate and datname <> 'postgres';"
    ],
    "query_result": [
        {
            "datname": "database1"
        },
        {
            "datname": "database2"
        },
        {
            "datname": "database3"
        }
    ],
    "rowcount": 3,
    "statusmessage": "SELECT 3"
}

内容的提问来源于stack exchange,提问作者D_man

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 08:20:00