如何动态构建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 }}"
方案说明
- 动态变量导入:通过
{{ group_names[0] }}获取当前主机所属的第一个组名,自动拼接成对应变量文件路径(如primary组主机自动导入primaryservices.yml),彻底摆脱静态路径限制。 - 简化逻辑:去掉原Playbook中重复的任务块,统一处理所有主机的服务启动逻辑,无论执行顺序如何变化,都能自动匹配对应服务列表。
- 容错性:若存在主机多组归属场景,可通过循环
group_names变量导入所有对应组的服务文件,或添加条件判断筛选目标组。
内容的提问来源于stack exchange,提问作者Anand Iyer
相关产品推荐
相关产品推荐

