Ansible脚本实现过期证书绑定信息提取写入文件的问题求助
解决Ansible处理JSON文件匹配合并的问题
问题根源分析
- AnsibleUnsafeText合并报错:读取JSON文件后未正确解析为Python字典/列表,变量仍为文本类型(AnsibleUnsafeText是Ansible对未解析文本的包装类),无法执行字典合并操作。
- list无daystoexpiration属性:直接对整个列表变量访问
daystoexpiration,但该属性属于列表内的单个字典元素,需遍历或筛选列表元素才能访问。
解决方案步骤
1. 正确读取并解析JSON文件
使用lookup结合from_json,或slurp后解析,确保变量转为Python可操作的列表/字典:
- name: 读取解析Certkey_output.json set_fact: certkey_list: "{{ lookup('file', './Certkey_output.json') | from_json }}" - name: 读取解析Certkey_binding_output.json set_fact: certkey_binding_list: "{{ lookup('file', './Certkey_binding_output.json') | from_json }}"
2. 筛选过期的certkey条目
从certkey_list中提取daystoexpiration为0的条目及对应的certkey名称:
- name: 筛选过期certkey条目 set_fact: expired_certkey_items: "{{ certkey_list | selectattr('daystoexpiration', 'equalto', 0) | list }}" expired_certkey_names: "{{ certkey_list | selectattr('daystoexpiration', 'equalto', 0) | map(attribute='certkey') | list }}"
3. 匹配并合并条目
遍历绑定列表,匹配过期certkey条目并合并两个字典的内容:
- name: 匹配合并条目 set_fact: merged_results: "{{ merged_results | default([]) + [ item | combine( (expired_certkey_items | selectattr('certkey', 'equalto', item.certkey) | first) ) ] }}" loop: "{{ certkey_binding_list }}" when: item.certkey in expired_certkey_names
4. 写入合并结果到文件
将合并后的列表转为格式化JSON写入目标文件:
- name: 写入合并结果 copy: content: "{{ merged_results | to_nice_json }}" dest: "./merged_certkey_result.json"
关键注意事项
- 确认JSON文件顶层结构为列表(如
[{"certkey":"xxx", "daystoexpiration":0}, ...]),若为字典需调整解析后的访问逻辑。 combine模块用于合并两个字典,需确保两个条目均以certkey作为匹配键。- 用
default([])初始化merged_results,避免首次循环时变量未定义报错。
内容的提问来源于stack exchange,提问作者abazaz
相关产品推荐
相关产品推荐

