我正在写一个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
开关,它可以打开文件名预处理。有什么办法可以近似这种行为?
答案 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
变量的值。