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
相关产品推荐
相关产品推荐

