将文件 glob 传递给 Ansible 角色

Pass a file glob to an Ansible role

我正在尝试将文件路径列表传递给一个角色,以便它可以使用 with_items 来处理它们。用例具有通用角色 (logstash),可以为其提供一组配置文件,并将其放置在主机上的正确目录中。

角色使用(理想)

- hosts: logstash
    roles:
      - role: logstash
        logstash_conf_files:
          - ../analytics/logstash/*.conf

角色任务

- name: Create Logstash configuration files.
  template:
    src: "{{ item }}"
    dest: "/etc/logstash/conf.d/{{ item | basename }}"
  with_items: logstash_conf_files
  notify: restart logstash

我知道我可以在 logstash_conf_files 的列表中明确列出文件名,但我宁愿让它从一组目录中自动选取它们。如果配置文件位于角色内部,它也会起作用,但这会使角色不可重用。

实现此目标的推荐方法是什么?

编辑:如果我使用相对于 roles/logstash/files/:

的目录,@tedder42 的解决方案有效
- hosts: logstash
    roles:
      - role: logstash
        logstash_conf_files: ../../../../analytics/logstash/*.conf

在角色任务中:

- name: Create Logstash configuration files.
  template:
    src: "{{ item }}"
    dest: "/etc/logstash/conf.d/{{ item | basename }}"
  with_fileglob: logstash_conf_files

这是一个完整的示例。

配置

cat glob.yml # (playbook)
---
- name: glob
  connection: local
  hosts: localhost
  roles:
    - { role: ls, list_dir: "/etc/*" }

cat roles/ls/tasks/main.yml
---
- name: list files
  command: ls {{item}}
  with_fileglob: list_dir

执行

$ ansible-playbook -i hosts.ini glob.yml

PLAY [glob] ******************************************************************* 

GATHERING FACTS *************************************************************** 
ok: [127.0.0.1]

TASK: [ls | list files] ******************************************************* 
changed: [127.0.0.1] => (item=/etc/afpovertcp.cfg)
changed: [127.0.0.1] => (item=/etc/aliases)
changed: [127.0.0.1] => (item=/etc/aliases.db)
changed: [127.0.0.1] => (item=/etc/asl.conf)
[...]