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_PASSWORD、CIRRUS_VRRP_PASS),避免密钥进入版本库。
剧本结构
ansible/playbooks/ 中的剧本将自动化步骤组合成流水线:
main.yml统一 orchestrate 生产发布:主机初始化、私有仓库部署、镜像构建、keepalived 配置、栈部署以及冒烟验证(含 VRRP VIP 检查)。library.yml为 library 环境提供同样流程,同时注入 HTTP 代理设置并默认跳过 VRRP 校验。build-push.yml、deploy.yml、docker.yml、keepalived.yml是可复用模块,被更高级别剧本调用。- 冒烟套件(
smoke.yml、smoke_ns.yml、smoke_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/,映射控制平面架构:
- Master(
docker-compose.master.yml.j2)运行 Redis(强制密码)、FastAPI API、Celery worker/beat,并暴露隐藏主 DNS 端口。环境变量对齐第 3、4、5 章介绍的CNAME_*、ACME_*、REDIS_*。 - Nodes(
docker-compose.node.yml.j2)包含 OpenResty、node-exporter、从 master 同步的 Redis 副本及 access 日志的 logrotate。构建参数如NGX_METRICS_ALLOW、NGX_RESOLVER、NGX_WORKER_CONNECTIONS均可配置。 - NS(
docker-compose.ns.yml.j2)封装 NSD,并模板化 SOA/NS 数据与指向隐藏主的 NOTIFY ACL。 - Monitoring(
docker-compose.monitor.yml.j2)构建 Prometheus、Grafana 镜像,使用主机网络并默认匿名访问(可通过grafana_admin_password覆盖)。 - ACME DNS(
docker-compose.acmedns.yml.j2)从acmedns/构建 acme-dns 权威服务器,并按照库存注入记录。
模板从库存变量共享参数,确保各栈 DNS 基础域、TTL 与 ACME 端点一致。
构建与发布流程
just deploy 通过 dotenv 加载环境变量,并默认执行 ansible/playbooks/main.yml。build-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 的部署可预测、健康可检、迭代快速。