Ansible中如何从字典列表提取属性并循环执行证书部署与配置?
Ansible 批量处理证书安装与certmap.conf生成解决方案
问题背景
在group_vars中定义了如下字典列表:
ipa_ca_anchors: - { certmap_name: CERT1, cert_cn: 'CN=CA1, OU=ROOT', cert_file: cert1.pem } - { certmap_name: CERT2, cert_cn: 'CN=CA2, OU=ROOT', cert_file: cert2.pem }
需要完成两个操作:
- 逐个执行
ipa-cacert-manage install命令安装每个证书 - 生成指定格式的
/etc/dirsrv/slapd-REALM/certmap.conf文件
此前的Playbook因使用map过滤生成列表,导致命令中出现[]格式错误,且无法实现逐个循环执行。
解决方案
1. 逐个安装CA证书
直接用loop遍历ipa_ca_anchors列表,每次循环取当前条目的cert_file字段拼接命令,实现逐个执行:
- name: 逐个安装CA证书 command: "ipa-cacert-manage install /etc/pki/ca-trust/anchors/{{ item.cert_file }}" loop: "{{ ipa_ca_anchors }}"
2. 生成certmap.conf配置文件
推荐使用template模块实现,配置格式更直观易维护:
步骤1:创建Jinja2模板文件
新建模板文件templates/certmap.conf.j2,内容如下:
{% for anchor in ipa_ca_anchors %} certmap {{ anchor.certmap_name }} {{ anchor.cert_cn }} {{ anchor.certmap_name }}:CmapLdapAttr seeAlso {{ anchor.certmap_name }}:verifycert off {% endfor %}
步骤2:在Playbook中调用模板生成文件
- name: 生成certmap.conf配置文件 template: src: certmap.conf.j2 dest: /etc/dirsrv/slapd-REALM/certmap.conf mode: '0644'
备选方案(不使用模板)
若坚持使用lineinfile,可先构造完整的配置行列表再循环写入:
- name: 构造certmap配置行列表 set_fact: certmap_lines: | {% for anchor in ipa_ca_anchors %} certmap {{ anchor.certmap_name }} {{ anchor.cert_cn }} {{ anchor.certmap_name }}:CmapLdapAttr seeAlso {{ anchor.certmap_name }}:verifycert off {% endfor %} register: certmap_config - name: 写入certmap.conf文件 lineinfile: path: /etc/dirsrv/slapd-REALM/certmap.conf state: present line: "{{ item }}" loop: "{{ certmap_config.certmap_lines.splitlines() | select('match', '.+') | list }}"
内容的提问来源于stack exchange,提问作者Super Tony
相关产品推荐
相关产品推荐

