LINUX.ORG.RU

Ansible синхронизация директорий

 


0

4

Есть директория с конфигами. Хочу скопировать ее на сервер и если какие-то файлы поменялись — рестартнуть сервис, конфиги которого я копирую. По наивности делал так:

- name: Copy configs
  copy:
    src: configs
    dest: /etc
  register: configs
- name: Restart service
  systemd:
    name: my-service
    state: restarted
  when: configs.changed

Проблема в том, что если я удаляю какие-то файлы с конфигами, то они не удаляются на удаленном сервере. Как сделать так, чтобы удалялись?

Читал про модуль synchronize. Вроде похоже на правду, но какой-то он, мягко говоря, странный, судя по доке.

По идее, я могу безусловно удалять директорию с конфигами на сервере, а потом подкладывать на ее место локальную, но тогда я потеряю событие changed. Хотя и это можно обойти какой-нибудь предварительной проверкой отличий директорий или копированием локальной директории куда-то в /tmp на сервере и потом ручным запуском rsync, но быть может есть какой-то более проостой способ решения этой проблемы?

Во времена /etc/foo.d/ может не стоит удалять все файлы? В Ansible несколько ролей могут управлять одним сервисом. Так что лучшее решение, это удаление файлов по списку, хоть оно и более муторным кажется.

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

Правильно понимаю, что потом надо будет отдельно сделать chown, а задать user и group как в copy нельзя?

Читаем документацию:

ANSIBLE.POSIX.SYNCHRONIZE:

`synchronize’ is a wrapper around rsync

man rsync:

> --owner, -o
              This option causes rsync to set the owner 
              of the destination file to be the same as
              the source file

Делаем вывод, что этот модуль (как и rsync), сам по себе, не может взять и поменять владельца на того, которого Вы укажете.

Так что да, Вы всё правильно понимаете:

потом надо будет отдельно сделать chown, а задать user и group как в copy нельзя?

Так что — используем модуль ANSIBLE.BUILTIN.FILE (например, вот так)

Harliff ★★★★★
()
10 февраля 2023 г.
Ответ на: комментарий от thesis

Модуль synchronize выглядит максимально инородно для ansible и использовать его не возникает никакого желания:

  1. пользователь/пароль ansible не подхватывается, приходится делать безпарольный sudo, потому что иначе модуль не работает
  2. по умолчанию происходит синхронизация юзером, группой и uid-ом локального польователя
  3. никаких стандартные фишки copy не работают

Модуль имеет право на существование, безусловно, но выглядит так, как-будто это максимально не ansible way, а просто топорная обвязка вокруг rsync.

Мне же хочется несколько иного, а именно: точно такого же поведения как у copy, но с возможностью удалалить файлы, если их нет в src-директории.

Goganchic ★★
() автор топика