以下是借助 SaltStack 批量替换 SSL 证书的完整方案,该方案结合了自动化更新与回滚机制,以保障操作的高效性与安全性:
一、准备工作
-
目录结构搭建
-
SaltStack 环境确认
- 确保所有目标 Minion 已通过
salt-key -A
完成证书认证。
- 确保所有目标 Minion 已通过
二、证书更新流程(update.sls )
# 定义变量(使用 Jinja 模板)
{% set domain = 'domain1' %}
{% set ssl_dir = '/usr/local/nginx/ssl' %}
{% set dst_dir = ssl_dir + '/' + domain %} # 目标证书路径
{% set bak_dir = '/opt/backup/ssl/' + domain %} # 备份目录 # 模块1:备份旧证书
backup_ssl: cmd.run: - name: |year=$(openssl x509 -in {{ dst_dir }}/server.pem -noout -enddate | awk -F '=' '{print $2}' | awk '{print $4}')mkdir -p {{ bak_dir }}/$year cp {{ dst_dir }}/* {{ bak_dir }}/$year/# 模块2:更新证书
ssl_update: file.recurse: - source: salt://ssl_update/ssl/{{ domain }} # Master 证书源路径 - name: {{ dst_dir }}- require: - cmd: backup_ssl # 模块3:重启服务(以 Nginx 为例)
nginx_reload: cmd.run: - name: /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload - require: - file: ssl_update
关键点:
- 备份时依据证书的有效期年份创建子目录,以便后续进行回滚操作;
- 运用
file.recurse
同步证书文件,自动覆盖旧文件; - 通过
require
确保操作步骤的顺序为:备份 → 更新 → 重启服务。
三、回滚机制(rollback.sls )
# 获取备份年份(优先从 Pillar 读取,否则取前一年)
{% set year = salt['pillar.get']('year', default=$(date +%Y -d "last year")) %}rollback: cmd.run: - name: cp {{ bak_dir }}/{{ year }}/* {{ dst_dir }}/- onchanges: - file: ssl_update # 仅当证书