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

Ansible导出AWS ACM证书CNAME与值至CSV时列格式异常求助

解决Ansible Playbook导出ACM CNAME到CSV的列对齐问题

问题原因

  • 原Playbook中cname和value是两个独立列表,with_items会先遍历完所有cname项再遍历value,导致数据无法按行配对。
  • lineinfile的insertafter: ','参数逻辑错误,会把所有数据挤在表头行的逗号后,格式完全混乱。

修复方案

方案一:JSON查询阶段直接配对数据

无需分开获取cname和value,直接通过JMESPath把每个域名验证项的名称和值配对成对象,后续直接生成CSV行:

tasks:
  - name: 获取所有ACM证书信息
    aws_acm_info:
      region: "{{ region }}"
    register: acm

  - name: 获取配对的CNAME与Value列表
    set_fact:
      cname_value_pairs: "{{ acm | json_query(jmesquery) }}"
    vars:
      jmesquery: 'certificates[*].domain_validation_options[].{name: resource_record.name, value: resource_record.value}'

  - name: 初始化CSV文件(写入表头)
    copy:
      content: "cname, value\n"
      dest: "{{ path }}"
    run_once: true

  - name: 写入CSV数据行
    lineinfile:
      dest: "{{ path }}"
      line: "{{ item.name }}, {{ item.value }}"
      insertafter: EOF
    loop: "{{ cname_value_pairs }}"

方案二:用zip合并已有列表

如果保留原有的cname和value获取逻辑,可通过zip过滤器将两个列表配对,再循环写入:

# 保留原有的获取acm、cname、value的任务...

  - name: 初始化CSV文件(写入表头)
    copy:
      content: "cname, value\n"
      dest: "{{ path }}"
    run_once: true

  - name: 写入CSV数据行
    lineinfile:
      dest: "{{ path }}"
      line: "{{ item.0 }}, {{ item.1 }}"
      insertafter: EOF
    loop: "{{ cname | zip(value) | list }}"

关键修改说明

  • 用copy模块替代shell命令初始化CSV,符合Ansible最佳实践,避免跨平台兼容性问题。
  • 通过配对数据或zip合并,确保每一行对应一组CNAME和Value,保证CSV列对齐。
  • 使用insertafter: EOF让数据追加到文件末尾,避免插入位置错误。

内容的提问来源于stack exchange,提问作者Maya Memane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 21:48:20