ansible 实现多版本应用并行部署的核心是分组隔离、变量动态注入和标签精准控制;每个版本拥有独立主机组、安装路径、端口和服务名,通过 --limit 和 --tags 按需触发部署,并显式对齐共享组件版本。

Ansible 实现多版本应用并行部署,核心在于利用分组隔离、变量动态注入和标签精准控制,让不同版本共存于同一基础设施而不冲突。关键不是“替换”,而是“隔离部署”——每个版本拥有独立的主机分组、路径、端口和服务名。
按版本分组定义目标主机
在 inventory 中为每个版本创建专属主机组,避免混用。例如部署两个版本的 Storm:
- 静态分组写法(推荐):在 hosts 文件中明确划分
[storm_nimbus_093]
mesos-storm-online001-bjdxt6.xxx.virtual
[storm_nimbus_096]
mesos-storm-online011-bjdxt.xxx.virtual
[storm_nimbus_093:vars]
storm_version=0.9.3_mesos-0.21.0_bjdxt-online03
[storm_nimbus_096:vars]
storm_version=0.9.6_mesos-0.21.0_bjdxt-online03
- 每个组绑定唯一 version 变量,后续任务可直接引用
{{ storm_version }} - 不建议把多个版本塞进同一个主机组再靠条件判断分流,易出错且难维护
用变量控制安装路径与服务标识
同一台机器上部署多个版本时,必须隔离运行环境:
- 为每个版本设置独立安装目录,如
/opt/storm-{{ storm_version }} - 生成 systemd 服务文件时,服务名需带版本后缀,如
storm-nimbus-{{ storm_version }}.service - 配置文件模板(Jinja2)中使用
{{ storm_version }}替换端口、日志路径、ZooKeeper 路径等关键项 - 若涉及端口监听,确保各版本使用不同端口(如 nimbus.port: 6627 vs 6628),避免冲突
通过 --limit 和 --tags 精准触发部署
不依赖全局执行,而是按需驱动:
- 同时部署多个版本:指定父组或通配符
ansible-playbook -i hosts/bjdxt-online03 mesos.yaml --tags storm_nimbus --limit storm_nimbus*
- 单独部署某版本:精确限制到子组
ansible-playbook -i hosts/bjdxt-online03 mesos.yaml --tags storm_nimbus --limit storm_nimbus_096
-
只更新配置不重启服务:加
--skip-tags restart - Playbook 内部应将「部署二进制」、「写配置」、「重启服务」拆分为不同 tags,便于组合控制
共享组件需显式版本对齐
当多个版本共用底层依赖(如 Java、Mesos、ZooKeeper 客户端库)时:
- 不要假设系统级 Java 版本兼容所有应用版本;建议用
alternatives或软链管理多 JDK,并在 task 中显式切换 - ZooKeeper 集群路径建议按版本隔离,如
/storm/0.9.3/nimbus和/storm/0.9.6/nimbus - 若 executor 运行在 Mesos slave 上,可在
[slaves:vars]中定义数组:storm_version: ["0.9.3_mesos...", "0.9.6_mesos..."],由 playbook 内循环展开部署










