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

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 }

需要完成两个操作:

  1. 逐个执行ipa-cacert-manage install命令安装每个证书
  2. 生成指定格式的/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:42:42