公司动态
使用 Ansible 批量更新服务器 SSL/TLS 证书实战指南
一、背景与需求在拥有数十甚至上百台服务器的生产环境中手动更新每台服务器上的 SSL/TLS 证书不仅耗时费力而且极易出错。证书过期可能导致服务中断、安全风险等严重问题。Ansible 作为一款强大的自动化运维工具能够通过编写 Playbook 实现证书的批量、一致、可靠更新。本文将手把手教你如何编写一个 Ansible Playbook实现以下目标将新证书文件分发到目标服务器组。在目标服务器上备份旧证书。替换 Nginx/Apache 等服务的证书文件。重新加载或重启相关服务使新证书生效。验证新证书是否部署成功。二、环境准备1. 控制机要求已安装 Ansible建议版本 2.9。配置好 SSH 密钥对能够免密登录所有目标服务器。准备好新的证书文件通常包含cert.pem证书和key.pem私钥。2. 目录结构建议按如下结构组织你的 Ansible 项目ansible-cert-update/ ├── inventory.ini # 主机清单文件 ├── playbook.yml # 主 Playbook ├── roles/ │ └── update_cert/ # 证书更新角色 │ ├── tasks/ │ │ └── main.yml # 任务定义 │ ├── files/ # 存放证书文件 │ │ ├── new_cert.pem │ │ └── new_key.pem │ └── templates/ # 配置文件模板可选 └── vars/ # 变量文件可选 └── main.yml三、编写 Ansible Playbook1. 主机清单 (inventory.ini)定义需要更新证书的服务器组。[web_servers] web01 ansible_host192.168.1.101 ansible_userroot web02 ansible_host192.168.1.102 ansible_userroot web03 ansible_host192.168.1.103 ansible_userroot [web_servers:vars] 定义证书在目标服务器上的路径 cert_dest_path/etc/nginx/ssl/ service_namenginx2. 主 Playbook (playbook.yml)--- - name: 批量更新服务器 SSL/TLS 证书 hosts: web_servers become: yes gather_facts: yes vars_files: - vars/main.yml # 可集中定义变量 tasks: - name: 确保目标证书目录存在 file: path: {{ cert_dest_path }} state: directory mode: 0755 - name: 备份旧证书文件如果存在 copy: remote_src: yes src: {{ cert_dest_path }}{{ item }} dest: {{ cert_dest_path }}{{ item }}.bak.{{ ansible_date_time.date }} mode: 0644 loop: - cert.pem - key.pem when: item is file # 简化逻辑实际可用stat模块判断 ignore_errors: yes # 如果旧证书不存在忽略错误继续 name: 分发新证书文件到目标服务器 copy: src: files/{{ item.src }} dest: {{ cert_dest_path }}{{ item.dest }} mode: 0644 loop: { src: new_cert.pem, dest: cert.pem } { src: new_key.pem, dest: key.pem } name: 验证证书文件权限 file: path: {{ cert_dest_path }}{{ item }} mode: 0644 owner: root group: root loop: cert.pem key.pem name: 重新加载服务配置适用于 Nginx systemd: name: {{ service_name }} state: reloaded when: service_name nginx name: 重启服务适用于 Apache 或其他需要重启的服务 systemd: name: {{ service_name }} state: restarted when: service_name ! nginx name: 验证新证书是否生效 shell: | echo | openssl s_client -connect localhost:443 -servername {{ inventory_hostname }} 2/dev/null | openssl x509 -noout -dates register: cert_check changed_when: false failed_when: false name: 输出证书有效期信息 debug: msg: {{ inventory_hostname }} 证书有效期: {{ cert_check.stdout_lines | last }}/code/pre变量文件 (vars/main.yml) - 可选集中管理变量便于维护cert_dest_path: /etc/nginx/ssl/ service_name: nginx backup_suffix: bak.{{ ansible_date_time.date }}四、执行与验证测试 Playbook 语法ansible-playbook playbook.yml --syntax-check试运行Dry Run使用 --check 模式模拟执行不会真正修改服务器。ansible-playbook playbook.yml --check正式执行ansible-playbook playbook.yml手动验证Playbook 执行后可以通过以下命令手动检查检查证书有效期openssl x509 -in /etc/nginx/ssl/cert.pem -noout -dates检查服务状态systemctl status nginx使用 curl 测试 HTTPS 访问curl -I https://your-domain.com五、进阶优化与注意事项安全性增强私钥权限确保私钥文件key.pem权限为 600仅 root 可读。使用 Ansible Vault如果证书文件包含敏感信息可使用 ansible-vault 加密。备份策略除了按日期备份建议将旧证书归档到指定备份目录。错误处理与回滚在关键步骤如分发文件、重启服务后添加错误判断。可以编写一个“回滚” Playbook在证书更新失败时自动恢复备份。支持多服务与多路径通过变量和条件判断使 Playbook 能适配 Nginx、Apache、HAProxy 等多种服务以及不同的证书存放路径。集成到 CI/CD 流水线将证书更新 Playbook 作为流水线的一个阶段在证书即将过期时自动触发更新。六、总结通过本文的步骤你可以快速构建一个可靠、可重复的服务器证书批量更新方案。Ansible 的幂等性保证了操作的安全性而清晰的步骤和验证机制则让整个流程可控、可审计。核心要点回顾规划先行明确证书路径、服务类型、备份策略。逐步测试充分利用 --check 和单台测试避免批量误操作。验证到位更新后务必检查证书有效期和服务状态。持续优化根据实际环境调整 Playbook加入错误处理和告警。现在你可以将上面的代码复制到你的项目中根据实际情况修改变量和主机信息开始你的自动化证书更新之旅