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

Ansible脚本实现过期证书绑定信息提取写入文件的问题求助

解决Ansible处理JSON文件匹配合并的问题

问题根源分析

  1. AnsibleUnsafeText合并报错:读取JSON文件后未正确解析为Python字典/列表,变量仍为文本类型(AnsibleUnsafeText是Ansible对未解析文本的包装类),无法执行字典合并操作。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 09:47:13