![如果需要先创建目录](https://linux22.com/image/627840/%E5%A6%82%E6%9E%9C%E9%9C%80%E8%A6%81%E5%85%88%E5%88%9B%E5%BB%BA%E7%9B%AE%E5%BD%95.png)
有没有一种简单的方法可以将一个装满模板 .j2 文件夹的文件夹部署到 Linux 机器上,使用与模板相同的名称,但不带 .j2 扩展名,而不是对每个文件使用模板模块?
现在我有一长串的清单:
- name: create x template
template:
src=files/x.conf.j2
dest=/tmp/x.conf
owner=root
group=root
mode=0755
notify:
- restart myService
答案1
您可以使用with_fileglob
从模板目录中获取文件列表,并使用过滤器去除 j2 扩展,如下所示:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
答案2
Ansible 的创建者 Michael DeHaan 发表了一篇帖子编码墙讨论的问题非常相似。您可以根据自己的需求(例如权限和所有权)进行调整和扩展。帖子的相关部分在这里:
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
,或者一个从剧本中的“ ”指令加载的 YAML 文件varsfiles
。看看如果我们这样做,这会如何清理。
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
答案3
我编写了一个文件树查找插件,可以帮助对文件树进行操作。
- https://github.com/ansible/ansible/pull/14332(Ansible v2.x)
- https://github.com/ansible/ansible/pull/14628(Ansible v1.9.x)
您可以递归文件树中的文件,并根据文件属性执行操作(例如模板或复制)。由于返回的是相对路径,因此您可以轻松地在目标系统上重新创建文件树。
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
它使得剧本更加易读。
如果需要先创建目录
在大多数情况下,我们的文件位于其他目录中,在这种情况下,我们需要先创建目录,然后复制文件。正如在官方文档
答案4
以下命令对我有用,可以递归查找模板中的 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') }}"