Ansible 本身不是高可用软件,但可通过标准化编排实现高可用环境:明确目标层级(前端、应用、数据、存储),用角色封装逻辑,强化一致性验证与可观测性,并保障控制节点自身高可用。

Ansible 本身不是高可用软件,但它能帮你构建高可用环境——关键不在工具本身,而在你如何用它编排服务、冗余组件和故障转移逻辑。
明确高可用目标与组件边界
先想清楚你要保障哪一层的可用性:是前端访问入口(如 Nginx + Keepalived)、应用服务(如多实例 WordPress)、数据层(如 MariaDB 主从),还是存储层(如 MinIO 纠删码集群)。Ansible 不自动实现高可用,而是把“部署高可用架构”的动作标准化、可重复化。
- 前端代理层:通常用双 Nginx + Keepalived 实现 VIP 漂移,Ansible 负责统一安装、配置、校验健康检查脚本
- 应用层:部署多个相同配置的应用节点,Ansible 确保每台机器的代码版本、PHP 设置、服务状态完全一致
- 数据层:虽不直接做主从复制,但可通过 playbook 自动执行初始化 SQL、配置 binlog、启动 slave IO/SQL 线程等关键步骤
- 存储层:例如 MinIO 4 节点集群,Ansible 可批量挂载磁盘、创建目录、分发启动命令、校验端口连通性,确保纠删码组能正常形成
用角色(Roles)封装高可用逻辑
避免把所有任务堆在一个 playbook 里。把 Keepalived、Nginx、MySQL Replication 等拆成独立 role,每个 role 包含 vars、tasks、handlers 和 defaults,便于复用和测试。
- 比如 keepalived role 应包含:安装包、生成 vrrp 配置(区分 MASTER/BACKUP)、启用服务、监听 notify 脚本
- mysql_replica role 应支持传入 master_host 变量,自动执行 CHANGE MASTER TO 并 START SLAVE
- 在主 playbook 中按顺序调用:先部署 master,再部署 replicas,最后部署前端负载层
强化一致性与可观测性
高可用的前提是“所有节点状态可预期”。Ansible 的幂等性是基础,但还需主动验证。
- 部署后加 task:用 uri 模块探测 Nginx 健康接口,或用 command 检查 MySQL 的 Slave_IO_Running 状态
- 失败时用 failed_when 显式中断,避免“看似成功实则异常”
- 结合 block/rescue 结构,在某节点失败时执行回滚操作(如关闭新启的 keepalived,恢复旧 VIP)
- 将关键检查结果写入 fact 或日志文件,方便后续巡检或对接 Prometheus
管理节点自身也要高可用(可选进阶)
控制机单点故障不影响已运行的服务,但会影响后续变更。生产中建议:
- 将 ansible.cfg、inventory、playbooks 存放在 Git 仓库中,配合 CI 流水线触发部署
- 用两台控制机,共享同一份代码库和密钥,任一宕机都可立即切到另一台执行 ansible-playbook
- 对 inventory 使用动态脚本(如从 CMDB 或云平台 API 拉取),避免静态 IP 列表过期失准

















