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

Ansible如何实现items嵌套循环 批量复制多域名SSL证书文件

Ansible SSL证书批量分发精简方案

你可以通过嵌套循环将重复的分发任务合并为单个任务,无需为每类证书单独编写配置,以下是两种可直接落地的实现方式:

方案1:固定证书类型的单任务实现

核心是用product过滤器将域名列表和证书后缀列表做笛卡尔积,自动遍历所有「域名+证书类型」的组合,适配Ansible 2.5及以上版本:

- name: 分发所有域名的SSL证书文件
  copy:
    src: "{{ item.0 }}/{{ item.0 }}.{{ item.1 }}"
    dest: "/etc/ssl/{{ item.0 }}.{{ item.1 }}"
    owner: 'root'
    group: 'root'
    mode: '0644'
  loop: "{{ x_ssl_certs | product(['key', 'crt', 'fullchain']) | list }}"
  • 循环中item.0为当前遍历到的域名,item.1为当前遍历到的证书后缀
  • 后续如果需要新增证书类型(比如pem、chain),只需要在后缀列表中追加对应字符串即可,无需修改任务逻辑

如果需要兼容Ansible 2.5以下的老版本,可以替换为with_nested写法,效果完全一致:

- name: 分发所有域名的SSL证书文件(兼容旧版Ansible)
  copy:
    src: "{{ item.0 }}/{{ item.0 }}.{{ item.1 }}"
    dest: "/etc/ssl/{{ item.0 }}.{{ item.1 }}"
    owner: 'root'
    group: 'root'
    mode: '0644'
  with_nested:
    - "{{ x_ssl_certs }}"
    - ['key', 'crt', 'fullchain']

方案2:自动识别证书文件(无需维护后缀列表)

如果你不想手动维护证书后缀列表,希望自动匹配每个域名目录下的所有合规证书文件,可以通过with_fileglob在控制端批量匹配文件,连域名列表都可以省略:

- name: 自动识别并分发所有存在的SSL证书文件
  copy:
    src: "{{ item }}"
    dest: "/etc/ssl/{{ item | basename }}"
    owner: 'root'
    group: 'root'
    mode: '0644'
  with_fileglob: "files/ssl_certs/*/*.{key,crt,fullchain}"

该写法会自动匹配playbook目录下files/ssl_certs/各域名子目录中所有后缀为key、crt、fullchain的文件,直接取源文件的文件名作为目标端存储的文件名,适配证书文件动态增减的场景。

注意:如果存在部分域名缺失某类证书的情况,可以在任务中添加ignore_errors: yes跳过缺失文件的报错,也可以提前通过stat模块判断文件存在性后再做分发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:39:25