将文件 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)
[...]
我正在尝试将文件路径列表传递给一个角色,以便它可以使用 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/
:
- 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)
[...]