Ansible:可自定义的模板文件名

时间:2018-12-10 16:21:00

标签: ansible jinja2 ansible-template

我正在写一个Ansible角色,其中有一些模板必须在一个目标目录中多次使用不同的名称显示。为了不必分别处理这些文件中的每一个,我将需要能够对它们的名称应用模板化或其他形式的占位符替换。举一个具体的例子,我可能有一个名为

的文件
{{ Client }}DataSourceContext.xml

我需要改成

AcmeDataSourceContext.xml

我有很多这类文件必须安装在不同的目录中,但是单个文件的所有副本都位于同一目录中。如果我不需要更改它们的名称或重复它们,则可以使用诸如

之类的方法来处理大量此类文件。
- name: Process a whole subtree of templates
  template:
    src: "{{ item.src }}"
    dest: "/path/to/{{ item.path }}"
  with_filetree: ../templates/my-templates/
  when: item.state == 'file'

我想我想要的是一个神奇的consider_filenames_as_templates开关,它可以打开文件名预处理。有什么办法可以近似这种行为?

1 个答案:

答案 0 :(得分:1)

几乎可以在Ansible中放置文字值的任何地方都可以代替变量的值。因此,例如,您可以执行以下操作:

- template:
    src: sometemplate.xml
    dest: "/path/to/{{ item }}DataSourceContext.xml"
  loop:
    - client1
    - client2

这最终将创建模板 /path/to/client1DataSourceContext.xml/path/to/client2DataSourceContext.xml

更新1

对于您在更新中提出的问题:

  

我想我想要的是一个神奇的think_filenames_as_templates开关,它可以打开文件名预处理。有什么办法可以近似这种行为?

似乎您可以执行以下操作:

- name: Process a whole subtree of templates
  template:
    src: "{{ item.src }}"
    dest: "/path/to/{{ item.path.replace('__client__', client_name) }}"
  with_filetree: ../templates/my-templates/
  when: item.state == 'file'

也就是说,将文件名中的字符串__client__替换为 client_name变量的值。