Ansible 容器集群自动化部署流程

宿主机初始化配置

确保宿主机满足以下条件:安装 Python 3、SSH 服务可用、root 或 sudo 权限。通过 Ansible 的 hosts 文件定义目标主机群组:

[container_hosts]
host1 ansible_host=192.168.1.10
host2 ansible_host=192.168.1.11

创建基础系统配置的 playbook base_setup.yml,包含时区设置、防火墙规则、必要工具安装(如 Docker 和容器运行时)。

容器运行时安装

使用 Ansible 模块安装 Docker 或 containerd。对于 Docker 部署示例:

- name: Install Docker
  hosts: container_hosts
  tasks:
    - name: Add Docker GPG key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present
    - name: Add Docker repository
      apt_repository:
        repo: "deb https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
        state: present
    - name: Install Docker packages
      apt:
        name: docker-ce,docker-ce-cli,containerd.io
        state: latest
        update_cache: yes

集群网络配置

使用 community.docker 模块创建覆盖网络或桥接网络:

- name: Create overlay network
  community.docker.docker_network:
    name: cluster_net
    driver: overlay
    scope: global

容器编排部署

通过 Ansible 部署容器编排工具如 Docker Swarm 或 Kubernetes 基础组件。Swarm 初始化示例:

- name: Initialize Swarm
  community.docker.docker_swarm:
    state: present
    advertise_addr: "{{ ansible_default_ipv4.address }}"

容器服务部署

定义容器服务模板 deploy_services.yml,使用变量文件动态配置镜像、端口等参数:

- name: Launch web service
  community.docker.docker_stack:
    name: web_app
    state: present
    compose:
      - version: '3'
        services:
          web:
            image: nginx:latest
            ports:
              - "80:80"
            networks:
              - cluster_net

配置管理与机密存储

使用 Ansible Vault 加密敏感数据,并在 playbook 中引用:

- name: Load secrets
  include_vars: secrets.yml
  no_log: true

- name: Deploy with secrets
  community.docker.docker_container:
    name: db
    image: postgres:13
    env:
      POSTGRES_PASSWORD: "{{ db_password }}"

健康检查与维护

添加定时任务检查容器状态,自动恢复异常服务:

- name: Monitor containers
  community.docker.docker_container_info:
    name: "{{ item }}"
  register: container_status
  loop: "{{ container_list }}"

- name: Restart failed containers
  community.docker.docker_container:
    name: "{{ item.item }}"
    state: restarted
  when: not item.exists or not item.Status.running
  loop: "{{ container_status.results }}"

日志与监控集成

配置容器日志驱动并部署监控组件(如 Prometheus 导出器):

- name: Configure logging
  community.docker.docker_container:
    name: app
    image: myapp:latest
    log_driver: syslog
    log_options:
      syslog-address: "udp://logserver:514"

- name: Deploy monitoring
  community.docker.docker_stack:
    name: monitoring
    compose:
      - file: ./monitoring/docker-compose.yml

滚动更新策略

通过标签控制更新批次,实现零停机部署:

- name: Rolling update
  community.docker.docker_service:
    name: frontend
    image: app:v2.0
    update_config:
      parallelism: 2
      delay: 10s
    labels:
      - "traefik.enable=true"

关键注意事项

  • 使用 ansible-playbook --limit 参数分阶段执行不同环境
  • 通过 group_vars/ 目录管理环境差异配置
  • 对容器镜像使用固定版本标签避免不可控更新
  • 在 playbook 中设置 serial 参数控制并发节点数

完整实现需结合具体基础设施调整网络插件、存储驱动等参数。建议通过 CI/CD 管道触发 playbook 执行,实现从代码提交到生产部署的完整自动化。

更多推荐