如何根据版本变量选择对应环境的Ansible hosts.ini清单文件?
根据Version变量选择对应环境的Ansible清单文件
需求概述
需要从inventories目录下各环境子文件夹的hosts.ini清单文件中,依据传入的version变量选择目标环境:
- 目录结构:
inventories/ preprod/ group_vars/ hosts.ini ... systest/ group_vars/ hosts.ini ... uat/ group_vars/ hosts.ini ...
- 选择规则:
- 若
version为1.x.x格式,选用preprod目录下的hosts.ini - 若
version为2.x.x格式,选用systest目录下的hosts.ini - 若
version为3.x.x格式,选用uat目录下的hosts.ini
- 若
原尝试的Playbook代码:
--- - name: Select hosts from multiple inventories based on version passed as a variable hosts: all vars: version: '1.0' tasks: - name: Get hosts from first inventory set_fact: hosts_1: "{{ groups['inventory_1'] | selectattr('version', 'equalto', version) | map(attribute='hostname') | list }}" - name: Get hosts from second inventory set_fact: hosts_2: "{{ groups['inventory_2'] | selectattr('version', 'equalto', version) | map(attribute='hostname') | list }}" - name: Merge hosts from both inventories set_fact: hosts: "{{ hosts_1 + hosts_2 }}" - name: Run tasks with hosts debug: msg: "{{ item }}" loop: "{{ hosts }}"
实现方案
不需要在Playbook内读取多个清单再筛选,直接根据version变量动态指定清单路径即可,提供两种可行方式:
方式1:命令行直接指定清单
执行Playbook时,根据version的值传递对应环境的清单路径:
# 针对1.x.x版本 ansible-playbook your_playbook.yml -e "version=1.2.3" -i inventories/preprod/hosts.ini # 针对2.x.x版本 ansible-playbook your_playbook.yml -e "version=2.1.0" -i inventories/systest/hosts.ini # 针对3.x.x版本 ansible-playbook your_playbook.yml -e "version=3.0.1" -i inventories/uat/hosts.ini
方式2:Playbook内动态处理清单逻辑
如果需要在Playbook内部完成版本匹配和清单加载,可通过本地任务解析版本、读取清单并添加临时主机组:
--- - name: 动态匹配目标环境清单 hosts: localhost gather_facts: false vars: version: "{{ version | default('1.0') }}" # 主版本号与清单路径的映射 inventory_map: "1": "inventories/preprod/hosts.ini" "2": "inventories/systest/hosts.ini" "3": "inventories/uat/hosts.ini" tasks: - name: 提取版本主版本号 set_fact: major_ver: "{{ version.split('.')[0] }}" - name: 校验版本合法性 fail: msg: "仅支持1.x.x/2.x.x/3.x.x格式的版本号" when: major_ver not in inventory_map.keys() - name: 读取对应环境的清单数据 command: ansible-inventory -i "{{ inventory_map[major_ver] }}" --list register: inv_output - name: 将清单主机添加到临时组 add_host: name: "{{ item.key }}" groups: target_hosts ansible_host: "{{ item.value.ansible_host | default(item.key) }}" # 按需添加其他主机变量 loop: "{{ (inv_output.stdout | from_json)._meta.hostvars | dict2items }}" - name: 在目标主机执行任务 hosts: target_hosts tasks: - name: 输出当前主机信息 debug: msg: "当前主机: {{ inventory_hostname }},对应环境: {{ hostvars.localhost.inventory_map[hostvars.localhost.major_ver] }}"
这个方案的核心逻辑:
- 从
version中提取主版本号,匹配预设的清单路径映射 - 用
ansible-inventory命令读取指定清单的完整主机数据 - 通过
add_host将主机添加到临时组,后续Play直接针对该组执行任务
内容的提问来源于stack exchange,提问作者Rahul Singh
相关产品推荐
相关产品推荐

