ansible在多环境部署中核心价值在于用同一套逻辑适配差异,避免配置混乱;通过inventory分组+变量隔离配置,playbook用when条件分支、tags选择任务、role封装复用逻辑,并结合ci/cd精准触发。

Ansible 在多环境部署中核心价值在于用同一套逻辑,适配不同环境的差异,避免“一套代码三套配置”的混乱局面。
用 Inventory 分组+变量隔离环境配置
Inventory 不只是记录 IP 的列表,更是环境策略的起点。你可以按环境分组,比如 [dev]、[test]、[prod],并在每组后直接定义该环境专属变量:
- [dev:vars] 定义 db_url: jdbc:mysql://dev-db:3306/app、app_port: 8080
- [prod:vars] 定义 db_url: jdbc:mysql://prod-cluster:3306/app、app_port: 443、ssl_enabled: true
- Playbook 中通过 {{ db_url }} 引用,执行时自动取对应组的值
Playbook 中通过条件控制流程分支
不是所有步骤都适用于每个环境。比如生产环境需要灰度发布、健康检查和回滚预案,而开发环境只需快速启动:
- 用 when: 判断当前主机所属组:when: inventory_hostname in groups['prod']
- 对测试环境跳过耗时的静态资源压缩:when: inventory_hostname not in groups['test']
- 用 tags 区分任务类型,部署时可指定只运行 --tags "deploy,healthcheck"(跳过数据库迁移)
用角色(role)封装可复用的环境逻辑
把通用能力抽象成 role,再按环境覆盖变量,比在每个 Playbook 里重复写 if 更清晰:
- 创建 roles/app-deploy/defaults/main.yml,放默认端口、日志路径等
- 在 group_vars/dev/ 和 group_vars/prod/ 下分别覆盖这些变量
- Playbook 只需包含 - role: app-deploy,环境差异由变量层自动生效
结合 CI/CD 实现环境精准触发
Ansible 本身不调度,但能无缝嵌入流水线:
- Git 分支决定目标环境:push 到 feature/* → 部署到 dev;merge 到 release/* → 部署到 test;tag v1.2.0 → 部署到 prod
- Jenkins 或 GitLab CI 中调用:ansible-playbook deploy.yml -i inventory/test -e "version={{ CI_COMMIT_TAG }}"
- 关键操作加 check_mode: yes 预检,或用 diff: true 显示配置变更预览











