Ansible: настраиваемые имена файлов шаблонов
Я пишу роль 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 ответ
Практически везде вы можете поместить буквенное значение в Ansible, вместо этого вы можете заменить значение переменной. Так, например, вы можете сделать что-то вроде этого:
- template:
src: sometemplate.xml
dest: "/path/to/{{ item }}DataSourceContext.xml"
loop:
- client1
- client2
Это приведет к созданию шаблонов/path/to/client1DataSourceContext.xml
а также/path/to/client2DataSourceContext.xml
,
Обновление 1
На вопрос, который вы задали в своем обновлении:
Полагаю, что мне бы хотелось, чтобы это был волшебный переключательдумка_файлов_символов, включающая предварительную обработку имени файла. Есть ли способ приблизить это поведение?
Кажется, вы могли бы просто сделать что-то вроде:
- 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
переменная.