You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据版本变量选择对应环境的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] }}"

这个方案的核心逻辑:

  1. 从version中提取主版本号,匹配预设的清单路径映射
  2. 用ansible-inventory命令读取指定清单的完整主机数据
  3. 通过add_host将主机添加到临时组,后续Play直接针对该组执行任务

内容的提问来源于stack exchange,提问作者Rahul Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:15:33