首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ansible:循环主机列表中的项并执行角色

Ansible:循环主机列表中的项并执行角色
EN

Server Fault用户
提问于 2022-11-04 13:16:46
回答 1查看 1.1K关注 0票数 0

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

库存:

代码语言:javascript
复制
[moduleA_hostgroup]
host1
host2
[moduleB_hostgroup]
host2
host3
[moduleC_hostgroup]
host1
host4

每个模块都有特定的位置和配置文件。我想获取所有已安装模块的配置

代码语言:javascript
复制
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']

我可以通过运行一个角色来检索这些模块的文件:

代码语言:javascript
复制
- 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..

问题是,我将不得不像运行模块一样多次运行角色,是否有一种优雅的方式循环遍历模块列表并仅在模块主机组上运行角色?

EN

回答 1

Server Fault用户

回答已采纳

发布于 2022-11-04 13:58:31

include_role应该能做到这一点。

代码语言:javascript
复制
---
- 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

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1114827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档