将文件glob传递给Ansible角色

时间:2015-02-26 19:06:50

标签: ansible

我试图将文件路径列表传递给角色,以便它可以使用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&#39的解决方案有效:

- 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

1 个答案:

答案 0 :(得分:2)

这是一个完全有效的例子。

构造

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)
[...]