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

如何动态构建Ansible Inventory与Vars文件并在Playbook中使用

动态化Ansible Inventory与服务变量文件方案

问题背景

目前使用静态的Inventory文件和服务变量文件,但执行顺序经常变化,希望改为动态传递这些文件,计划用Jinja模板实现,寻求技术方案。

现有文件内容

1. Inventory文件(/inventory/PROD/hosts.ini)

[primary]
PRI123.example.com
PRI333.example.com
[secondary]
SEC123.example.com
SEC345.example.com

2. 服务变量文件

主端服务列表(/vars/primaryservices.yml)

---
services:
  - RSAservice1
  - RSAservice2
  - RSAservice3

从端服务列表(/vars/secondaryservices.yml)

---
services:
  - RSAsecservice1
  - RSAsecservice2
  - RSAsecservice3

3. 现有启动服务Playbook(start_windows_services.yml)

---
- name: 启动Windows服务
  hosts: all
  gather_facts: false

tasks:
  - name: 导入主端应用服务列表
    include_vars:
       file: ../vars/primaryservices.yml
  - name: 启动主端应用服务
    win_service:
      name: "{{ item }}"
      state: started
    loop: "{{ services }}"
    when: inventory_hostname in groups['primary']

  - name: 导入从端应用服务列表
    include_vars:
       file: ../vars/secondaryservices.yml
  - name: 启动从端应用服务
    win_service:
      name: "{{ item }}"
      state: started  # 修正原Playbook参数错误,应为state而非start
    loop: "{{ services }}"
    when: inventory_hostname in groups['secondary']

动态化实现方案

无需复杂的Jinja模板,直接利用主机组名动态匹配变量文件即可实现需求,既简洁又灵活:

优化后的Playbook

---
- name: 动态启动Windows服务
  hosts: all
  gather_facts: false

tasks:
  - name: 动态导入对应组的服务变量
    include_vars:
      file: "../vars/{{ group_names[0] }}services.yml"
    # 注:假设每个主机仅属于primary/secondary其中一个组;若主机多组归属,可调整逻辑遍历组名

  - name: 启动对应组的服务
    win_service:
      name: "{{ item }}"
      state: started
    loop: "{{ services }}"

方案说明

  1. 动态变量导入:通过{{ group_names[0] }}获取当前主机所属的第一个组名,自动拼接成对应变量文件路径(如primary组主机自动导入primaryservices.yml),彻底摆脱静态路径限制。
  2. 简化逻辑:去掉原Playbook中重复的任务块,统一处理所有主机的服务启动逻辑,无论执行顺序如何变化,都能自动匹配对应服务列表。
  3. 容错性:若存在主机多组归属场景,可通过循环group_names变量导入所有对应组的服务文件,或添加条件判断筛选目标组。

内容的提问来源于stack exchange,提问作者Anand Iyer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:17:46