Ansible:循环遍历主机列表的项目并执行角色

Ansible:循环遍历主机列表的项目并执行角色

我有一个由分布在多个主机上的微模块组成的应用程序。

存货:

[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

相关内容