上一篇 下一篇 分享链接 返回 返回顶部

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

发布人:Minchunlin 发布时间:2025-07-15 09:22 阅读量:868

在我们香港业务节点逐步扩展之后,面对的最大难题之一就是如何批量自动化部署服务实例、实现容器级别的高可用架构,并且能够在多个物理服务器之间灵活调度和恢复服务。我曾尝试手工部署,效率极低,而且一旦需要更新服务镜像或变更配置,整个流程极其脆弱。直到我们引入 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 的高可用部署方案在香港服务器的实际运营中已经稳定运行半年以上,大幅提高了我们运维效率和服务稳定性。尤其是在跨境业务高峰时,容器+自动化部署的组合给了我们极大的灵活性。如果你也在运营多节点的服务系统,不妨从这套体系出发,构建自己的自动化高可用架构。

目录结构
全文