下面从思路 → 架构 → 实战示例 → 注意事项四个层面,讲清楚如何用 Ansible 做灾备切换(DR Switchover / Failover)。
在动手前,先区分两种场景:
| 类型 | 说明 | Ansible 角色 |
|---|---|---|
| Switchover(计划内切换) | 主动演练、维护 | 完全可用 |
| Failover(故障切换) | 生产故障 | 可用,但需配合监控/脚本触发 |
Ansible 本身不是调度系统,而是执行引擎,通常配合:
生产中心 (Primary)
├─ DB (MySQL/PG)
├─ 应用 (Nginx + App)
└─ VIP / DNS
灾备中心 (Standby)
├─ DB (Slave / 只读)
├─ 应用 (停止 or 待命)
└─ VIP / DNS
切换目标:
[primary]
db1 ansible_host=10.0.0.11
app1 ansible_host=10.0.0.12
[standby]
db2 ansible_host=10.0.1.11
app2 ansible_host=10.0.1.12
[dr:children]
primary
standby
dr_failover.yml- name: DR Failover
hosts: all
become: yes
serial: 1
tasks:
- name: Stop primary app
systemd:
name: myapp
state: stopped
when: inventory_hostname in groups['primary']
- name: Promote standby DB
shell: pg_ctl promote
when: inventory_hostname in groups['standby']
- name: Start standby app
systemd:
name: myapp
state: started
when: inventory_hostname in groups['standby']
- name: Switch VIP
include_tasks: switch_vip.yml
when: inventory_hostname in groups['standby']
- name: Disable VIP on primary
systemd:
name: keepalived
state: stopped
when: inventory_hostname in groups['primary']
- name: Enable VIP on standby
systemd:
name: keepalived
state: started
when: inventory_hostname in groups['standby']
- name: Update DNS to standby
uri:
url: https://dns-api.example.com/update
method: POST
body:
record: app.example.com
value: 10.0.1.12
when、stat、changed_when- name: Check DB replication lag
shell: check_lag.sh
register: lag
failed_when: lag.stdout|int > 10
dr_rollback.yml
Prometheus / Zabbix
↓ (alert)
Ansible AWX / Tower
↓
dr_failover.yml
推荐:
❌ 直接用 Ansible 做自动故障检测
✅ 用监控触发 Ansible
❌ 忽略数据一致性
✅ 先停写、再切换
❌ 不考虑脑裂
✅ 用 fencing / VIP 控制
你可以告诉我:
我可以直接给你一份可落地的完整 Ansible 灾备项目结构。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。