如何用Ansible和Docker自动化部署和管理香港多台服务器的高可用服务架构?

在我们香港业务节点逐步扩展之后,面对的最大难题之一就是如何批量自动化部署服务实例、实现容器级别的高可用架构,并且能够在多个物理服务器之间灵活调度和恢复服务。我曾尝试手工部署,效率极低,而且一旦需要更新服务镜像或变更配置,整个流程极其脆弱。直到我们引入 Ansible + Docker 的自动化体系之后,才彻底解决了这一痛点。
接下来我会基于我们的实战经验,从零构建一套面向香港多台裸金属/云主机环境的 高可用服务自动化部署方案,实现包括服务部署、容器管理、故障自愈和高可用代理等功能。
一、基础环境准备
1.1 节点规划(示例)
| 角色 | 主机名 | IP 地址 | 系统 |
|---|---|---|---|
| 控制节点 | ansible-master | 10.0.0.10 | Ubuntu 22.04 |
| 应用节点A | hk-node-01 | 10.0.0.11 | Ubuntu 22.04 |
| 应用节点B | hk-node-02 | 10.0.0.12 | Ubuntu 22.04 |
| VIP浮动IP | 10.0.0.100 | N/A | Keepalived使用 |
所有节点均需开启SSH互信(使用 ssh-copy-id 完成),并关闭防火墙或开放Ansible与Docker所需端口。
二、核心技术架构图
┌──────────────────────────────┐
│ Ansible Master │
│ (部署+管理中心) │
└──────────────────────────────┘
│
┌──────────┴──────────┐
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ hk-node-01 │ │ hk-node-02 │
│ Docker + HAProxy│ │ Docker + HAProxy│
└─────────────────┘ └─────────────────┘
▲ ▲
│ Keepalived + VIP(10.0.0.100)
└──────────┬──────────┘
▼
对外统一访问入口(高可用服务)
三、Ansible 自动化部署流程
3.1 目录结构
ansible-ha-deploy/
├── inventory/
│ └── hosts.yml
├── roles/
│ ├── docker/
│ │ └── tasks/main.yml
│ ├── haproxy/
│ │ └── tasks/main.yml
│ ├── keepalived/
│ │ └── tasks/main.yml
│ └── app_deploy/
│ └── tasks/main.yml
├── playbooks/
│ └── site.yml
└── group_vars/
└── all.yml
四、核心角色配置与部署逻辑
4.1 安装 Docker(roles/docker/tasks/main.yml)
- name: 安装 Docker
apt:
name: [docker.io, docker-compose]
state: present
update_cache: yes
- name: 启动并设置 Docker 服务开机启动
systemd:
name: docker
enabled: yes
state: started
4.2 部署 HAProxy 作为容器反向代理(roles/haproxy/tasks/main.yml)
- name: 创建 HAProxy 配置文件
template:
src: haproxy.cfg.j2
dest: /opt/haproxy/haproxy.cfg
- name: 启动 HAProxy 容器
docker_container:
name: haproxy
image: haproxy:2.8
state: started
restart_policy: always
volumes:
- /opt/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg
ports:
- "80:80"
配置模板示例 templates/haproxy.cfg.j2
global
daemon
maxconn 256
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
frontend http-in
bind *:80
default_backend app_servers
backend app_servers
balance roundrobin
server app1 127.0.0.1:8080 check
4.3 应用服务部署(roles/app_deploy/tasks/main.yml)
- name: 拉取并运行应用服务
docker_container:
name: myapp
image: myregistry/app:latest
state: started
restart_policy: always
published_ports:
- "8080:8080"
4.4 高可用 Keepalived 配置(roles/keepalived/tasks/main.yml)
- name: 安装 keepalived
apt:
name: keepalived
state: present
update_cache: yes
- name: 配置 keepalived
template:
src: keepalived.conf.j2
dest: /etc/keepalived/keepalived.conf
owner: root
group: root
mode: 0644
- name: 启动 keepalived
systemd:
name: keepalived
state: restarted
enabled: yes
模板 keepalived.conf.j2(使用优先级实现主备)
vrrp_instance VI_1 {
state {{ keepalived_role }}
interface eth0
virtual_router_id 51
priority {{ keepalived_priority }}
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
10.0.0.100
}
}
配置变量示例:
# group_vars/all.yml
keepalived_role: "MASTER" # 或 BACKUP
keepalived_priority: 100 # 或 90
五、部署执行与维护
5.1 运行主 Playbook
# playbooks/site.yml
- hosts: all
become: yes
roles:
- docker
- app_deploy
- haproxy
- keepalived
ansible-playbook -i inventory/hosts.yml playbooks/site.yml
5.2 节点新增/滚动部署逻辑
当需要扩容节点,只需:
- 在 inventory/hosts.yml 添加新节点
- 设置对应 group_vars
- 再次执行 ansible-playbook,自动完成应用部署与HA接入
六、高可用效果验证
Keepalived VIP 漂移测试:
手动停止 MASTER 节点的 keepalived 服务,观察 VIP 是否在 BACKUP 节点漂移,并能继续响应请求。
容器重启恢复:
停掉某节点的 myapp 容器,Docker 自动重启生效,或者配合 Ansible Tower/AWX 定时巡检重部署。
负载均衡分发:
多次访问 http://10.0.0.100/,验证后端容器的请求轮询分发逻辑是否生效(可在 app 返回主机名进行验证)。
七、进阶建议
使用 Docker Swarm / Kubernetes 替代 HAProxy+Keepalived 构建原生集群;
Ansible 集成 GitOps,结合 CI/CD 流程实现自动构建镜像并部署;
利用 etcd 做应用配置动态下发,支持容器级热更新;
增加监控(Zabbix、Prometheus)对 Docker 和服务状态实时采集与告警。
结语
这套 Ansible + Docker 的高可用部署方案在香港服务器的实际运营中已经稳定运行半年以上,大幅提高了我们运维效率和服务稳定性。尤其是在跨境业务高峰时,容器+自动化部署的组合给了我们极大的灵活性。如果你也在运营多节点的服务系统,不妨从这套体系出发,构建自己的自动化高可用架构。