跳到主要内容

Ansible 自动化

Ansible 负责在各环境中部署、升级与验证 Cirrus CDN。本章概述库存结构、剧本编排、可复用角色与模板化方法,确保基础设施定义与控制平面架构保持一致。

自动化目标

  • 为所有运行层(主控、节点、DNS、监控、acme-dns)提供可重复部署。
  • 捕获环境特定拓扑同时避免重复逻辑。
  • 将 Docker Compose 生命周期封装在可靠的角色内。
  • 将冒烟测试与运维工具视为一等自动化步骤。

库存模型

ansible/ 下包含两套库存:

  • inventory/hosts.ini 描述类生产拓扑(master、registry、nodes、ns、monitor、acmedns),共享变量位于 inventory/group_vars/all.yml,涵盖 Redis 凭据、VRRP VIP、DNS 参数与健康检查默认值。
  • inventory.library/hosts.ini 表示“library” 预发环境,其 group_vars/all.yml 会覆盖特性,如关闭 CNAME(空基础域)或为 Docker 安装提供代理。

两套库存均依赖环境变量获取敏感输入(如 CIRRUS_REDIS_PASSWORDCIRRUS_VRRP_PASS),避免密钥进入版本库。

剧本结构

ansible/playbooks/ 中的剧本将自动化步骤组合成流水线:

  • main.yml 统一 orchestrate 生产发布:主机初始化、私有仓库部署、镜像构建、keepalived 配置、栈部署以及冒烟验证(含 VRRP VIP 检查)。
  • library.yml 为 library 环境提供同样流程,同时注入 HTTP 代理设置并默认跳过 VRRP 校验。
  • build-push.ymldeploy.ymldocker.ymlkeepalived.yml 是可复用模块,被更高级别剧本调用。
  • 冒烟套件(smoke.ymlsmoke_ns.ymlsmoke_vrrp.yml)通过 /api/v1/domains 注入临时域名,并使用 HTTP、dig 探测验证 API、DNS 与 VIP。

剧本在部署阶段偏好 strategy: free,提升跨主机并行度,同时通过模板化 Compose 定义保持幂等。

角色与复用

compose_deploy

roles/compose_deploy 封装 Docker Compose v2 生命周期:

  • 将特定栈的 docker-compose.yml(及附属文件)渲染至主机目录(/opt/cirrus-*)。
  • 调用 community.docker.docker_compose_v2 且启用 remove_orphans=true,安全对齐服务。
  • 通过 extra_templates 变量支持额外模板(Grafana、Prometheus 配置)。

该角色统一 master、node、ns、monitor、registry、acmedns 各栈的启动方式。

keepalived_vrrp

roles/keepalived_vrrp 封装多 VIP 主备配置:

  • 在支持的发行版(Debian、RHEL/openEuler)安装 keepalived 与 curl。
  • 应用 ARP 强化 sysctl,避免 VRRP 引发 ARP 波动。
  • 使用确定性优先级轮换模板化 keepalived.conf,在节点之间均衡 VIP 所有权,并尊重 cluster_vips 顺序。
  • 部署基于 curl 的健康脚本,检查 http://127.0.0.1/(或自定义 check_url),在节点异常时按 check_script_weight 降级优先级。

handlers 确保配置变更触发 keepalived 重启,维持 VRRP 状态一致。

Docker Compose 模板

Compose 蓝图位于 ansible/templates/,映射控制平面架构:

  • Masterdocker-compose.master.yml.j2)运行 Redis(强制密码)、FastAPI API、Celery worker/beat,并暴露隐藏主 DNS 端口。环境变量对齐第 3、4、5 章介绍的 CNAME_*ACME_*REDIS_*
  • Nodesdocker-compose.node.yml.j2)包含 OpenResty、node-exporter、从 master 同步的 Redis 副本及 access 日志的 logrotate。构建参数如 NGX_METRICS_ALLOWNGX_RESOLVERNGX_WORKER_CONNECTIONS 均可配置。
  • NSdocker-compose.ns.yml.j2)封装 NSD,并模板化 SOA/NS 数据与指向隐藏主的 NOTIFY ACL。
  • Monitoringdocker-compose.monitor.yml.j2)构建 Prometheus、Grafana 镜像,使用主机网络并默认匿名访问(可通过 grafana_admin_password 覆盖)。
  • ACME DNSdocker-compose.acmedns.yml.j2)从 acmedns/ 构建 acme-dns 权威服务器,并按照库存注入记录。

模板从库存变量共享参数,确保各栈 DNS 基础域、TTL 与 ACME 端点一致。

构建与发布流程

just deploy 通过 dotenv 加载环境变量,并默认执行 ansible/playbooks/main.ymlbuild-push.yml 会在 .compose-build/ 下渲染临时 Compose 清单,执行 docker compose build/push 构建每个服务组并推送至内部仓库(registry_address)。部署剧本在角色执行时拉取最新镜像,确保主机运行新版本。

对于 library 环境,同一流水线使用 inventory.library,沿用代理配置与简化 DNS 设置,保持预发与生产一致性而无需复制代码。

运维流程

  • 引导——执行 ansible-galaxy install -r requirements.yml 获取角色依赖,设置库存所需密钥,然后运行 just deploy(或 ansible-playbook -i inventory deploy.yml)。
  • 滚动更新——先执行 build-push.yml,再运行 deploy.yml;Compose 拉取新镜像并在各主机的 docker-compose.yml 目录中平滑重启服务。
  • 故障修复——playbooks/cleanup.yml 可在偏差恢复时执行主机级 Docker 清理;冒烟剧本在变更后提供验收,确保 incident 关闭前完成验证。

可扩展性指引

  • 新增栈时编写对应 Compose 模板,并在独立 play 或现有 play 中调用 compose_deploy
  • 通过环境变量或 Ansible Vault 注入秘密,切勿在模板中硬编码。
  • 保持库存 group vars 与 Docker 环境变量对称,避免配置漂移。
  • 当新增环境变量或 Redis 键时,更新第 11 章附录的速查表。

Ansible 是连接文档化架构与实际运行环境的纽带,使 Cirrus CDN 的部署可预测、健康可检、迭代快速。