Ansible 比较两个字典中的两个值

Ansible 比较两个字典中的两个值

我有一个简单的问题,我有两个字典,一个是静态的,里面有一些数据,另一个是存储在变量(带寄存器)中的 stat 命令的结果。目的只是将主机上某些文件的校验和与存储在静态字典中的校验和进行比较。最简单的方法是什么?我想确保值对应于正确的 id,因此不仅要按列表循环,还要使用 id 作为索引(因为 id 号不是相互跟随的,所以我们有随机的 id 值)。

static_dir: 
  id1: <checksum>
  id2: <checksum>
  id5: <checksum>

result_dir:
  results:
    item: id1
    stat:
      checksum: <checksum>
    item: id5
    stat:
      checksum: <checksum>
.....

提前感谢您的回答和解释。

问候,

马修

答案1

例如,鉴于静态目录供测试用

    static_dir: 
      id1: 123
      id2: 456
      id5: 789

我认为结果是一个列表。例如,

    result_dir:
      results:
        - item: id1
          stat:
            checksum: 123
        - item: id5
          stat:
            checksum: 789

创建词典

    dynamic_dir: "{{ dict(result_dir.results |
                          json_query('[].[item, stat.checksum]')) }}"

给出

  dynamic_dir:
    id1: 123
    id5: 789

那么比较就很简单了。例如,

    - debug:
        msg: |
          static: {{ static }}
          dynamic: {{ dynamic }}
      vars:
        static: "{{ dynamic_dir.keys() | map('extract', static_dir) }}"
        dynamic: "{{ dynamic_dir.values() }}"

给出

  msg: |-
    static: [123, 789]
    dynamic: [123, 789]

完整测试剧本的示例

- hosts: all

  vars:

    static_dir: 
      id1: 123
      id2: 456
      id5: 789

    result_dir:
      results:
        - item: id1
          stat:
            checksum: 123
        - item: id5
          stat:
            checksum: 789

    dynamic_dir: "{{ dict(result_dir.results |
                          json_query('[].[item, stat.checksum]')) }}"

  tasks:

    - debug:
        var: dynamic_dir

    - debug:
        msg: |
          static: {{ static }}
          dynamic: {{ dynamic }}
      vars:
        static: "{{ dynamic_dir.keys() | map('extract', static_dir) }}"
        dynamic: "{{ dynamic_dir.values() }}"

    - assert:
        that: dynamic | difference(static) | length == 0
        success_msg: '[OK]  Checksums match.'
        fail_msg: '[ERR] Checksums do not match.'
      vars:
        static: "{{ dynamic_dir.keys() | map('extract', static_dir) }}"
        dynamic: "{{ dynamic_dir.values() }}"

可选地,列出失败的 ID

    - assert:
        that: dynamic | difference(static) | length == 0
        success_msg: '[OK]  Checksums match.'
        fail_msg: |
          [ERR] Failed checksums: {% for id,checksum in dynamic_dir.items() %}
          {% if static_dir[id] != checksum %}
          {{ id }} {% endif %}
          {% endfor %}
      vars:
        static: "{{ dynamic_dir.keys() | map('extract', static_dir) }}"
        dynamic: "{{ dynamic_dir.values() }}"

相关内容