ansible通过变量驱动任务分支实现部署路径控制,核心是when条件判断、include_tasks动态加载、角色条件启用及set_fact预计算决策变量。

Ansible 中通过变量控制部署路径,核心在于 when 条件判断 + 变量驱动的任务分支。它不是切换物理目录,而是让同一份 playbook 根据不同变量值,执行完全不同的任务序列——比如安装 MySQL 还是 PostgreSQL,部署到测试环境还是生产环境,启用 TLS 还是跳过证书配置。
用 when 实现基础条件分支
每个任务都可以加 when,只在条件满足时运行。变量可以来自 inventory、playbook vars、facts 或命令行传入(-e)。
-
when: env_type == "prod"—— 仅生产环境执行高危操作(如重启服务) -
when: ansible_distribution in ["Ubuntu", "Debian"]—— 按系统类型选包管理器 -
when: db_engine is defined and db_engine == "mysql"—— 只有定义了且值为 mysql 才走 MySQL 安装流程 -
when: not ssl_enabled | bool—— 布尔变量取反,禁用 SSL 时跳过证书部署
用 include_tasks 动态加载不同部署逻辑
把不同路径的部署步骤拆成独立文件,用变量决定加载哪一个,比堆满 when 更清晰可维护。
- 准备两个任务文件:
tasks/deploy_mysql.yml和tasks/deploy_postgres.yml - 主 playbook 中写:
- name: 加载对应数据库部署任务<br> include_tasks: "{{ db_engine }}.yml"<br> when: db_engine in ["mysql", "postgres"] - 这样只需传入
-e db_engine=mysql,就自动走 MySQL 路径;传postgres就走另一套
结合角色(role)按变量选择执行路径
角色本身支持条件启用。你可以在 roles/ 下放多个角色,再用变量控制是否包含:
- 定义角色变量:
vars: { deploy_monitoring: true, deploy_backup: false } - 在 roles 列表中加条件:
- role: monitoring<br> when: deploy_monitoring | bool
- 或更灵活地用变量拼角色名:
- role: "{{ app_framework }}-config"<br> when: app_framework in ["django", "flask"]
用 set_fact 预计算路径决策
复杂逻辑建议先用 set_fact 算出一个明确的开关变量,再统一用它控制后续所有任务。
- 例如根据磁盘剩余空间决定部署模式:
- name: 计算部署策略<br> set_fact:<br> deploy_mode: "light"<br> when: ansible_facts['ansible_mounts'] | selectattr('mount', 'equalto', '/') | map(attribute='size_available') | first | int - 后面所有任务都用
when: deploy_mode == "light"统一判断,避免重复计算











