返利網(wǎng)站程序產(chǎn)品推廣
以下是借助 SaltStack 批量替換 SSL 證書的完整方案,該方案結(jié)合了自動(dòng)化更新與回滾機(jī)制,以保障操作的高效性與安全性:
一、準(zhǔn)備工作
-
目錄結(jié)構(gòu)搭建
- 在 Salt Master 的
/home/salt/ssl_update
目錄下構(gòu)建如下結(jié)構(gòu):ssl_update/ ├── update.sls # 更新證書的狀態(tài)文件 ├── rollback.sls # 回滾證書的狀態(tài)文件 └── ssl/ # 存放證書文件 ├── domain1/ # 按域名分類 │ ├── server.key │ └── server.pem └── domain2/├── server.key └── server.pem
- 按照域名分類,將新證書存入對應(yīng)的目錄。
- 在 Salt Master 的
-
SaltStack 環(huán)境確認(rèn)
- 確保所有目標(biāo) Minion 已通過
salt-key -A
完成證書認(rèn)證。
- 確保所有目標(biāo) Minion 已通過
二、證書更新流程(update.sls )
# 定義變量(使用 Jinja 模板)
{% set domain = 'domain1' %}
{% set ssl_dir = '/usr/local/nginx/ssl' %}
{% set dst_dir = ssl_dir + '/' + domain %} # 目標(biāo)證書路徑
{% 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:重啟服務(wù)(以 Nginx 為例)
nginx_reload: cmd.run: - name: /usr/local/nginx/sbin/nginx -t && /usr/local/nginx/sbin/nginx -s reload - require: - file: ssl_update
關(guān)鍵點(diǎn):
- 備份時(shí)依據(jù)證書的有效期年份創(chuàng)建子目錄,以便后續(xù)進(jìn)行回滾操作;
- 運(yùn)用
file.recurse
同步證書文件,自動(dòng)覆蓋舊文件; - 通過
require
確保操作步驟的順序?yàn)?#xff1a;備份 → 更新 → 重啟服務(wù)。
三、回滾機(jī)制(rollback.sls )
# 獲取備份年份(優(yōu)先從 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 # 僅當(dāng)證書