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
相关产品推荐
相关产品推荐

