19.2.7 自动化交付与变更协同
在资产管理与资源编排体系中,自动化交付与变更协同是连接资源编排、配置管理与发布管理的关键枢纽。本节给出可落地的交付链路、变更协同、回滚验证与合规审计实践,并提供可执行示例、排错与练习。
自动化交付建议采用“标准化资产模型 + 编排模板 + 可执行流水线”的四层分层架构:基础设施层、系统层、应用层、验证层。其核心是模板化、幂等、可追踪。
交付与变更协同流程推荐采用“变更单—任务流—回执”的三段式模型,确保可追踪、可验证、可回滚。
sequenceDiagram
participant U as 申请人
participant P as 平台
participant A as 审批
participant E as 执行引擎
participant R as 资源/服务
U->>P: 提交变更单(资源/范围/窗口)
P->>A: 触发审批
A-->>P: 审批通过
P->>E: 生成任务流/锁定资源
E->>R: 执行变更(分批/灰度)
R-->>E: 执行结果
E->>P: 回执+日志+指标
P-->>U: 验证结果/回滚入口
交付示例:基线+应用+验证(Ansible 交付流水线)#
以下示例使用 Ansible 完成交付:新主机基线、安装 Nginx、注册监控探针、健康检查。目录结构如下:
/opt/delivery/
├── inventory.ini
├── site.yml
└── roles/
├── baseline/
│ └── tasks/main.yml
├── nginx/
│ ├── tasks/main.yml
│ └── templates/nginx.conf.j2
└── verify/
└── tasks/main.yml
1)安装与准备
# 控制端安装
sudo yum install -y epel-release
sudo yum install -y ansible
# 目标主机准备:允许 SSH
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.21
2)编排清单 inventory
# /opt/delivery/inventory.ini
[web]
10.0.0.21 ansible_user=root
3)主入口 site.yml
# /opt/delivery/site.yml
- hosts: web
become: yes
roles:
- baseline
- nginx
- verify
4)基线角色
# /opt/delivery/roles/baseline/tasks/main.yml
- name: 设置时区
command: timedatectl set-timezone Asia/Shanghai
- name: 安装基础工具
yum:
name: [vim, curl, net-tools]
state: present
- name: 禁用SELinux
selinux:
state: disabled
5)Nginx 交付
# /opt/delivery/roles/nginx/tasks/main.yml
- name: 安装Nginx
yum:
name: nginx
state: present
- name: 配置Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
- name: 启动Nginx
systemd:
name: nginx
state: started
enabled: yes
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
# /opt/delivery/roles/nginx/templates/nginx.conf.j2
user nginx;
worker_processes auto;
events { worker_connections 1024; }
http {
server {
listen 80;
location /healthz {
return 200 "ok\n";
}
}
}
6)验证与回执
# /opt/delivery/roles/verify/tasks/main.yml
- name: 健康检查
shell: "curl -sf http://127.0.0.1/healthz"
register: healthz
retries: 3
delay: 2
until: healthz.rc == 0
- name: 写入交付回执
copy:
content: "nginx=ok\nhealthz={{ healthz.stdout }}\n"
dest: /var/log/delivery_receipt.txt
7)执行
cd /opt/delivery
ansible-playbook -i inventory.ini site.yml
# 预期效果:Nginx 安装完成,/healthz 返回 ok,回执文件存在
变更协同与回滚示例#
以 Nginx 配置变更为例,使用版本化配置与快速回滚。
# 变更前备份(配置级回滚)
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%F_%H%M)
# 执行变更(示例:增加 server_name)
sed -i 's/server {/server_name example.com;\nserver {/' /etc/nginx/nginx.conf
# 语法检查与灰度重载
nginx -t && systemctl reload nginx
# 验证
curl -I http://127.0.0.1/healthz
回滚操作:
# 回滚配置并重载
cp /etc/nginx/nginx.conf.bak.2024-01-01_1030 /etc/nginx/nginx.conf
nginx -t && systemctl reload nginx
幂等、锁与分批策略示例(变更锁)#
通过锁文件确保对同一资源的变更串行化:
# /usr/local/bin/change_lock.sh
LOCK=/var/lock/change_$(hostname)
exec 9>"$LOCK"
flock -n 9 || { echo "资源被锁,退出"; exit 1; }
echo "执行变更..."
# 执行变更命令
sleep 3
echo "完成"
可观测性接入示例(Prometheus Node Exporter)#
交付完成后接入监控,确保变更可验证:
# 安装 Node Exporter
useradd -r -s /sbin/nologin node_exporter
curl -L -o /tmp/node_exporter.tar.gz https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xf /tmp/node_exporter.tar.gz -C /opt/
cp /opt/node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
cat >/etc/systemd/system/node_exporter.service <<'EOF'
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
# 验证
curl -s http://127.0.0.1:9100/metrics | head
排错清单(常见问题快速定位)#
- Nginx 启动失败:
nginx -t查看语法错误;journalctl -u nginx -n 50查看错误日志。 - 配置未生效:检查是否 reload 成功;确认变更是否被 Ansible 模板覆盖。
- 监控未采集:确认 9100 端口开放;检查 Prometheus 目标状态是否 UP。
- 变更冲突:检查变更锁是否释放:
ls -l /var/lock/change_*。
练习#
- 将 Nginx
/healthz改为/ready,使用变更锁执行,验证并回滚。 - 为 Redis 交付创建 Ansible 角色,输出回执文件包含版本号与端口。
- 设计一个包含“审批—执行—验证—回执”的变更流程图,并标注审批超时策略。
- 为 Prometheus 增加静态目标配置,验证 Node Exporter 能被采集。
通过模板化、流程化与可观测化的闭环建设,自动化交付与变更协同可实现交付速度提升、风险可控、资产状态一致,为平台化运维奠定基础。