如果需要先创建目录

如果需要先创建目录

有没有一种简单的方法可以将一个装满模板 .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

我编写了一个文件树查找插件,可以帮助对文件树进行操作。

您可以递归文件树中的文件,并根据文件属性执行操作(例如模板或复制)。由于返回的是相对路径,因此您可以轻松地在目标系统上重新创建文件树。

- 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') }}"

相关内容