Розгортання папки файлів шаблонів за допомогою ansible


47

Чи є простий спосіб розгорнути папку, наповнену шаблоном .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

Відповіді:


67

Ви можете використовувати with_fileglobсписок файлів із каталогу шаблонів і використовувати фільтри, щоб зняти розширення j2.

- name: create x template
  template:
    src: {{ item }}
    dest: /tmp/{{ item | basename | regex_replace('\.j2','') }}
  with_fileglob:
    - ../templates/*.j2

11
Примітка with_fileglobзавжди працює з files/, ви можете перейти до шаблонів за допомогою ../templates/mytemplate/*. stackoverflow.com/a/27407566/1695680
ThorSummoner

2
Дякую, це дуже корисно. Я виявив, що мені довелося використовувати два зворотних косих риски, щоб уникнути буквального періоду у функції regex_replace. Можливо, тому, що у мене була вся частина шаблону dest в межах подвійних лапок, щоб я міг використовувати формат YAML для визначення завдання (який я віддаю перевагу над форматом з одним вкладишем).
Тоні Чезаро

1
це передбачає , що тільки файли живуть в папці шаблонів, якщо вам потрібно підтримувати як каталоги і файли в папці шаблонів , то вам потрібно with_filetree - см stackoverflow.com/questions/41667864 / ...
danday74

Примітка, яка regex_replaceповинна відповідати в кінці рядка \.j2$для випадків, коли шаблон може існувати всередині імені файлу.
Бретт Райан

20

Майкл ДеХаан (творець Ansible) виступив із повідомленням на CoderWall, в якому розповідає про дуже схожу проблему. Ви можете налаштувати та розширити його відповідно до своїх потреб (наприклад, дозволів та прав власності). Відповідна частина публікації тут:


Це можна спростити за допомогою " with_items" і одного notifyзаяви. Якщо будь-яке із завдань зміниться, сервіс буде повідомлено точно так само, як і потрібно перезапустити в кінці запуску ігрової книги.

 - 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

5
Більш простим методом може бути написання template: src=templates/{{item}}.j2 dest=/etc/splat/{{item}}.conf, а потім використання простого списку предметів:with_items: - foo - bar
Етан

Це насправді виглядає не так. Правильна лінія шаблону була б template: src={{item.src}} dest={{item.dest}}(тобто не, ${var}але скоріше {{var}})
Fabiano Francesconi

@FabianoFrancesconi оновлено.
Mxx

9

Відповідь Рассела справді працює, але потребує вдосконалення

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

Ялиці всіх $ потрібно пройти, як це було неправильним регулярним виразом в regex_replace. По-друге, всі файли повинні бути в каталозі файлів, а не в каталозі шаблонів


4
Ласкаво просимо до помилки сервера! Ваша відповідь передбачає, що ефективне рішення питання доступне за допомогою попередньої відповіді, тому було б більш доречно як редагування цієї відповіді. Подумайте про видалення поточної відповіді та запропонуйте змінити відповідь Рассела.
Павло

7

Я написав плагін пошуку файлів, який може допомогти в дії з деревами файлів.

Ви можете повторювати файли в дереві файлів і на основі властивостей файлу виконувати дії (наприклад, шаблон або копіювати). Оскільки відносний шлях повернуто, ви можете легко відтворити філетка в цільових системах.

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

Це робить для більш читаними ігрові книги.


Це ще не об’єднано :-(
Морган Крістіанссон

2
Вона була злита.
Dag Wieers

Чи є спосіб фільтрувати скажіть тільки * .conf файли?
Андрій

Впевнені, що в частині "коли:" ви можете написати вираз, що відповідає вашим потребам.
Dag Wieers

1
Плагін не повільний, це робить процес шаблонування та копіювання кожного файлу окремо. Але це майже не має нічого спільного з плагіном, плагін може бути корисним для інших речей, ніж шаблонування чи копіювання.
Dag Wieers

3

Команда нижче працює для мене, щоб зробити рекурсивний пошук 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') }}"

1

Є можливість автоматично схопити список фактичних файлів із каталогу та повторити їх.

- 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() }}"

Зверніть увагу на стандартне застереження щодо розділення на нову лінію - назви файлів можуть містити нові рядки. Більш безпечним рішенням є використання утиліти оболонки, яка підтримує print0, наприклад find, і потім розділити на \u0000.
Dejay Clayton
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.