我有一个简单的问题,我有两个字典,一个是静态的,里面有一些数据,另一个是存储在变量(带寄存器)中的 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() }}"