воскресенье, 21 мая 2023 г.

ansible: некоторые особенности with_fileglob

 Типовое применение: из templates/nginx/sites-available/ нужно скопировать с заменой переменных ряд конфигов. Вариант "в лоб":

- name: install sites

   template:

     src: "{{ item }}"

     dest: "/etc/nginx/sites-enabled/{{ item }}"

   with_items:

     - nginx/sites-available/site1.conf

     - nginx/sites-available/site2.conf

Это хорошо, пока сайтов 2-3, но если их 50? На каждый чих менять неудобно, и есть механизмы копирования "всего из папки". И имя такому механизму - with_fileglob. Но... там есть нюансы.

Если в примере выше просто заменить with_items то ничего хорошего не выйдет.

Казалось бы, будет тот же '{{ item }}', но по факту рабочий конфиг выглядит так

- name: install sites

   template:

     src: "{{ item }}"

     dest: "/etc/nginx/sites-enabled/{{ item | basename | regex_replace('\.j2$', '') }}"

   with_fileglob: "templates/nginx/sites-available/*.conf.j2"

Да, тут шаблоны уже .j2, вся доработка для первого блока это  | regex_replace('\.j2$', ''). Причём работать будет даже если файл просто .conf (меняем строку выборки у файлглоба), просто не произойдёт замены имени ибо нечего. Тут суть в basename.

А ещё он сам не заглянет в templates, это нужно указывать явно.

Причём один раз у меня работало через массив (это как в первом примере), правда из одного элемента. (пример). А ещё файлглоб не умеет в рекурсию, для этого нужны другие механизмы.

Есть ещё варианты, в том числе find (по ссылке достаточно примеров) и даже такие извраты как shell ls -1 и подобное. А ещё можно нарисовать свой модуль.



Комментариев нет:

Отправить комментарий