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

