Есть ли простой способ развернуть папку, полную папку шаблона .j2, в ящик Linux, используя то же имя, что и шаблон, но без расширения .j2, вместо использования модуля шаблона для каждого файла?
Прямо сейчас у меня длинный список:
- name: create x template
template:
src=files/x.conf.j2
dest=/tmp/x.conf
owner=root
group=root
mode=0755
notify:
- restart myService
Вы могли бы использовать with_fileglob
чтобы получить список файлов из каталога вашего шаблона и использовать фильтры для удаления расширения j2 следующим образом:
- name: create x template
template:
src: "{{ item }}"
dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
with_fileglob:
- ../templates/*.j2
Майкл ДеХаан (создатель Ansible) оставил сообщение на CoderWall это говорит об очень похожей проблеме. Вы можете настроить и расширить его в соответствии со своими потребностями (например, разрешениями и правами собственности). Соответствующая часть сообщения находится здесь:
Это можно упростить, используя "with_items
"и сингл notify
заявление. Если какая-либо из задач изменится, служба будет уведомлена точно так же, как ее необходимо перезапустить в конце выполнения playbook.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items:
- { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
- { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
notify:
- restart fooserv
Обратите внимание: поскольку у нас есть задачи, которые принимают более одного уникального аргумента, мы не просто говорим "item
" в 'template:
'строка, но используйте with_items
с переменной хеша (словаря). Вы также можете сделать его немного короче, используя списки, если хотите. Это стилистическое предпочтение:
- name: template everything for fooserv
template: src={{item.0}} dest={{item.1}}
with_items:
- [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
- [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
notify:
- restart fooserv
Конечно, мы могли бы также определить список, по которому вы проходили, в другом файле, например "groupvars/webservers
"файл, чтобы определить все переменные, необходимые для webservers
группа, или файл YAML, загруженный из "varsfiles
директива внутри сборника пьес. Посмотрите, как это можно очистить, если мы это сделаем.
- name: template everything for fooserv
template: src={{item.src}} dest={{item.dest}}
with_items: {{fooserv_template_files}}
notify:
- restart fooserv
Ответ Рассела работает, но требует улучшения.
- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
- files/*.j2
Первым из всех $ нужно уйти, так как в regex_replace было неправильное регулярное выражение. Во-вторых, все файлы должны находиться в каталоге файлов, а не в каталоге шаблонов.
Я написал плагин поиска файловых деревьев, который может помочь с действиями над файловыми деревьями.
Вы можете повторно просматривать файлы в дереве файлов и на основе свойств файла выполнять действия (например, шаблон или копирование). Поскольку возвращается относительный путь, вы можете легко воссоздать дерево файлов в целевой системе (ах).
- name: Template complete tree
template:
src: '{{ item.src }}'
dest: /web/{{ item.path }}
force: yes
with_filetree: some/path/
when: item.state == 'file'
Это делает пьесы более читаемыми.
Приведенная ниже команда сработала для меня, чтобы выполнить рекурсивный поиск файлов j2 в шаблонах и переместить их в место назначения. Надеюсь, это поможет кому-то, кто ищет рекурсивную копию шаблонов по назначению.
- name: Copying the templated jinja2 files
template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"
Есть возможность автоматически получить список актуальных файлов из каталога и затем перебрать их.
- name: get the list of templates to transfer
local_action: "shell ls templates/* | sed 's~.*/~~g'"
register: template_files
- name: iterate and send templates
template: src=templates/{{ item }} dest=/mydestination/{{ item }}
with_items:
- "{{ template_files.stdout.splitlines() }}"
Я сделал это, и это сработало. \ o /
- name: "Create file template"
template:
src: "{{ item.src }}"
dest: "{{ your_dir_remoto }}/{{ item.dest }}"
loop:
- { src: '../templates/file1.yaml.j2', dest: 'file1.yaml' }
- { src: '../templates/file2.yaml.j2', dest: 'file2.yaml' }