LINUX.ORG.RU
ФорумAdmin

Ansible - сформировать файл из трех

 ,


0

2

Не могу сообразовать как сделать такую вещь.

Нужно сформировать один файл из трех,четырех итд (не важно сколько)

Первое на ум приходит использовать lineinfile

Суть:

Если меняется первая часть файла , то изменения должны быть на всех серверах, так как они все используют первую часть по определению.

Если меняется вторая часть, то сервера которые ее не используют, не запускаются.

Третья , значит первые и вторые отдыхают, для них изменений нет.

итд.

Как формировать файл понятно, не понятно как сделать такую проверку. Можно было бы использовать md5 , но честно не очень хочется это делать.


Используйте шаблоны и Jinja2

some text for all servers
{% if ansible_fqdn in groups['servers_prod'] %}
{% include 'servers_prod.j2' %}
{% endif %}
{% if ansible_fqdn in groups['servers_dev'][0] %}
{% include 'servers_dev.j2' %}
{% endif %}
WoozyMasta
()
Последнее исправление: WoozyMasta (всего исправлений: 1)
Ответ на: комментарий от WoozyMasta

Да с этим я не работал. Почитаю.

А как быть с файлом ? Например 1 файл у нас не изменился для 1 сервера и в общем система сама определит , что ничего не надо делать. Для второго сервера, это будет уже другой файл - так как он формируется из файла 1 и файла 2. итд.

TuLiss
() автор топика
Ответ на: комментарий от TuLiss

Хммм Если только сделать слияние файла где-то и его сравнить ?

TuLiss
() автор топика
Ответ на: комментарий от TuLiss

Роли и группы.

Примерно так:

- name: start config GW server
  command: "/opt/HP/BSM/bin/silentConfigureBSM.sh /tmp/{{ silent_install_conf.grp }}.xml"
  register: results
  when: silent_install_conf.grp == 'gateway'
  become: yes  

knock
()

Нужно как-то определить какой файл изменился, и на основании него что-то делать.

Тоесть если смена в файле filename_2, тогда,

  • склеить файл
  • применить на группу серверов которая использует данный файл

Если смена в файле filename_1, тогда,

  • склеить файл
  • применить на группу серверов all

Суть в том, что файли разные, а простиню с них делает уже сам Ансибл.

Определить изменился ли файл, можно, с помощью rsync (если не копирует - значит изменений нет). Или хэш сравнить

i3wm
()
Ответ на: комментарий от i3wm

Если изменился filename_1 , то для первого сервера просто скопировать , а другие склеивать да.

rsync или хэш то же не даст результата.

Те в итоге все равно, надо где-то фоном файлы собрать и сверить.

Пока сделать лучше 3 playbook и дергать в зависимости от группы. Другого варианты я пока не вижу.

TuLiss
() автор топика
Ответ на: комментарий от i3wm

Честно, что то я уже совсем закопался.

Думал , что lineinfile может прочитать два, три файла и сделать один. Теперь вижу, что он может изменять файл. Но, хотелось бы найти простой split.

Что-то мне кажется проще будет shell сделать.

TuLiss
() автор топика
Ответ на: комментарий от i3wm

Просто наверно когда знаешь.


---
- name: Generate File
  hosts: all
  become: true
  gather_facts: true

  vars:
    my_file: /etc/file
    my_template: /etc/ansible/templates/file.j2

  tasks:
    - name: Create "{{ my_file }}"
      template:
        src:    "{{ my_template }}"
        dest:   "{{ my_file }}"
        owner:  root
        group:  root
        mode:   "0644"
        backup: yes

Это в общем работает, но смысла в таком варианте от j2 мало.

Сделал как выше. Назначил группу, но вот include не отрабатывается. или я не понял смысла или еще чего.

TuLiss
() автор топика

Блоки в джиндже + инклюді

(тред не читал)

PunkoIvan ★★★★
()
Ответ на: комментарий от TuLiss

Убрал условие, получил ошибку

FAILED! => {«changed»: false, «msg»: «TemplateNotFound

Все файлы на месте, права то же.

TuLiss
() автор топика
Ответ на: комментарий от TuLiss

Так ошибку убрал. Без if все отрабатывает нормально, с if увы не работает.

TuLiss
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.