Назад | Перейти на главную страницу

Развертывание папки с файлами шаблонов с помощью ansible

Есть ли простой способ развернуть папку, полную папку шаблона .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' }