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 переменная.

Другие вопросы по тегам