Answers:
您可以用来with_fileglob
从模板目录中获取文件列表,并使用过滤器像这样剥离j2扩展名。
- name: create x template
template:
src: {{ item }}
dest: /tmp/{{ item | basename | regex_replace('\.j2','') }}
with_fileglob:
- ../templates/*.j2
regex_replace
应在行末匹配注释\.j2$
。
Michael DeHaan(Ansible的创建者)在CoderWall上发表了一篇帖子,谈到了非常相似的问题。您可以根据需要(例如权限和所有权)调整和扩展它。帖子的相关部分在这里:
可以通过使用“ with_items
”和单个notify
语句来简化此操作。如果任何任务发生更改,则将以与在剧本运行结束时需要重新启动的方式完全相同的方式通知该服务。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items:
- { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
- { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
notify:
- restart fooserv
请注意,由于我们的任务需要多个唯一的参数,因此,我们不仅item
在' template:
'行中说了“ ” ,还使用with_items
了哈希(字典)变量。如果愿意,还可以使用列表将其缩短一些。这是一种风格偏好:
- name: template everything for fooserv
template: src={{item.0}} dest={{item.1}}
with_items:
- [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
- [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
notify:
- restart fooserv
当然,我们也可以在另一个文件中定义要遍历的列表,例如groupvars/webservers
用于定义webservers
组所需的所有变量的“ ”文件,或从varsfiles
剧本中的“ ”指令加载的YAML文件。看看我们如何清理。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf
,然后使用简单的项目列表:with_items: - foo - bar
template: src={{item.src}} dest={{item.dest}}
(即不是${var}
,而是{{var}}
)
罗素的答案确实有效,但需要改进
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
由于regex_replace中的正则表达式是错误的,因此需要除去所有$的冷杉。其次,所有文件应位于文件目录中而不是模板目录中
我编写了一个文件树查找插件,该插件可帮助您对文件树进行操作。
您可以对文件树中的文件进行递归,并根据文件属性执行操作(例如,模板或副本)。由于返回了相对路径,因此您可以轻松地在目标系统上重新创建文件树。
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
它使可读性更高的剧本。
下面的命令对我有用,它可以对模板中的j2文件进行递归查找,并将其移至目标位置。希望它可以帮助寻找模板的递归副本到目标的人。
- name: Copying the templated jinja2 files
template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"
可以自动从目录中获取实际文件列表,然后对其进行迭代。
- name: get the list of templates to transfer
local_action: "shell ls templates/* | sed 's~.*/~~g'"
register: template_files
- name: iterate and send templates
template: src=templates/{{ item }} dest=/mydestination/{{ item }}
with_items:
- "{{ template_files.stdout.splitlines() }}"
print0
(例如)的shell实用程序,find
然后拆分\u0000
。
with_fileglob
始终使用进行操作files/
,您可以使用进入模板../templates/mytemplate/*
。stackoverflow.com/a/27407566/1695680