我有一个由分布在多个主机上的微模块组成的应用程序。
存货:
[moduleA_hostgroup]
host1
host2
[moduleB_hostgroup]
host2
host3
[moduleC_hostgroup]
host1
host4
每个模块都有特定的位置和配置文件。我想获取所有已安装模块的配置
vars:
modules:
moduleA:
path: "/opt/moduleA"
files_to_fetch: ['*.conf']
moduleB:
path: "/etc/moduleB"
files_to_fetch: ['*.json','*.properties']
moduleC:
path: "/etc/moduleC"
files_to_fetch: ['*.conf','*.json']
我可以通过运行角色来检索模块的这些文件:
- hosts: moduleA_hostgroup
pre_tasks:
- name: pre_tasks
set_fact:
path: "{{ modules.moduleA.path }}"
pattern: "{{ modules.moduleA.files_tofetch }}'
roles:
- ../roles/fetch_module_config
- hosts: moduleB_hostgroup
pre_tasks:
- name: pre_tasks
set_fact:
path: "{{ modules.moduleB.path }}"
pattern: "{{ modules.moduleB.files_tofetch }}'
roles:
- ../roles/fetch_module_config
etc..
问题是,我必须按照模块的次数运行角色,是否有一种优雅的方式循环遍历模块列表并仅在模块主机组上运行角色?
答案1
include_role
应该可以解决问题。
---
- hosts: hosts
vars:
modules:
moduleA:
path: "/opt/moduleA"
files_to_fetch: ['*.conf']
moduleB:
path: "/etc/moduleB"
files_to_fetch: ['*.json','*.properties']
moduleC:
path: "/etc/moduleC"
files_to_fetch: ['*.conf','*.json']
tasks:
- name: Collecting Data
include_role:
name: fetch_module_config
vars:
path: "{{ item.value.path }}"
pattern: "{{ item.value.files_to_fetch }}"
loop: "{{ modules | dict2items }}"
when: item.key in group_names
但这太笨重了。在我看来,角色不适合这样的任务,你应该考虑将其转换为任务,然后使用它include_task
。