Ansible可通过Inventory分组、变量隔离、模板化配置和独立服务管理实现多版本并行部署。按版本分组主机,定义专属路径/端口/模板,用template模块渲染差异化配置,通过systemd实例化服务(如[email protected])实现进程隔离,并支持Nginx或云LB切流与回滚。
Ansible 本身不直接支持“多版本并行部署”这一概念——它不管理应用版本生命周期或流量路由,但可通过组合 Inventory 分组、变量隔离、Playbook 结构与模块能力,实现同一套基础设施上多个应用版本的快速、隔离、可回滚部署。关键不在“Ansible 做版本管理”,而在“用 Ansible 精准控制不同版本的部署边界”。
避免混用主机承载多个版本(易冲突),优先采用物理或逻辑隔离:
/etc/ansible/hosts 或自定义 inventory 文件中,按版本明确分组:[app-v1.2]web1.example.com ansible_host=192.168.10.101[app-v2.0]web2.example.com ansible_host=192.168.10.102web3.example.com ansible_host=192.168.10.103
[app-v1.2:vars]app_release_dir = /opt/myapp/v1.2app_port = 8080config_template = templates/app.conf.j2[app-v2.0:vars]app_release_dir = /opt/myapp/v2.0app_port = 8081config_template = templates/app-v2.conf.j2
ansible app-v2.0 -m ping 或 ansible-inventory --graph
避免硬编码,通过 Jinja2 模板注入版本相关参数,确保配置与部署动作严格绑定:
- name: 创建版本专属应用目录file: path: "{{ app_release_dir }}" state: directory mode: '0755'
- name: 渲染 v2.0 应用配置template: src: "{{ config_template }}" dest: "{{ app_release_dir }}/conf/app.conf" mode: '0644'
templates/app-v2.conf.j2 示例:release_version: {{ ansible_version | default('2.0') }}listen_port: {{ app_port }}log_path: /var/log/myapp/{{ ansible_version | default('v2.0') }}/
利用 Ansible 的并发机制(forks)和幂等性,让不同版本部署互不干扰:
---- name: Deploy app v2.0 in parallel hosts: app-v2.0 forks: 10 become: yes
service 模块精确控制版本对应的服务实例:- name: 启动 v2.0 应用服务(独立 systemd unit) systemd: name: "[email protected]" state: started enabled: yes
[email protected]),用 [email protected] 和 [email protected] 实现进程级隔离Ansible 不接管负载均衡器,但可调用其 API 或修改配置完成灰度/切流:
- name: Switch nginx upstream to v2.0 lineinfile: path: /etc/nginx/conf.d/upstream.conf regexp: '^s*server.*v1.2' line: ' server 192.168.10.102:8081; # v2.0' backup: yes
- name: Update ALB target group to v2.0 instances community.aws.elb_target_group: target_group_arn: "{{ tg_arn }}" targets: - id: "i-0abc123def456"