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

Запретить rsync удалять исключенные каталоги

Я использую rsync через Ansible синхронизировать модуль со следующим определением задачи:

synchronize: src='{{ local_app_path }}/.' dest='{{ remote_app_path }}/' perms=no owner=yes rsync_opts=--delete-after

При выполнении этой задачи генерируется следующая команда:

rsync --delay-updates -FF --compress --archive --no-perms --rsh 'ssh  -S none -o StrictHostKeyChecking=no' --rsync-path="sudo rsync" --delete-after --out-format='<<CHANGED>>%i %n%L' "../src/." "vagrant@192.168.55.55:/var/www/app/"

Макет моего каталога выглядит следующим образом:

src/
    # ...
    app/
    test/
    node_modules/
    package.json
provisioning/
    # ...
    playbook.yml
.rsync-filter

Это мой .rsync-фильтр:

exclude /src/.env
exclude /src/node_modules

Теперь я ожидаю запустить свою задачу синхронизации, и результирующая структура каталогов на сервере будет выглядеть следующим образом (обратите внимание на отсутствующий node_modules папка):

app/
test/
package.json

Это работает. Однако как только я создаю node_modules папка на сервере ...

app/
test/
node_modules/
package.json

... и снова запустите синхронизацию, node_modules-папка снова удаляется с сервера (хотя я исключил ее в своем .rsync-фильтре):

app/
test/
package.json

Я жду node_modules-папка, которая будет храниться на сервере, потому что она у меня указана в моем .rsync-filter и я не использую --delete-excluded вариант.

Как я могу предотвратить удаление моих исключенных файлов / каталогов с помощью rsync?

Большое спасибо за твою помощь! :)

Это -FF это вызывает вашу проблему. Это останавливает -rsync-filter файл копируется и, как сказано на странице руководства rsync ...

MERGE-FILE FILTER RULES
       ...
       These per-directory rule files must be created on the sending side because it is the
       sending side that is being scanned for the available files to transfer. These rule files may also
       need to be transferred to the receiving side if you want them to affect what files don’t get deleted
       (see PER-DIRECTORY RULES AND DELETE below).

Важный момент - последнее предложение в этом цитируемом разделе. Изменение -FF к -F дает желаемое поведение.

У меня очень похожая проблема, как у автора OP. Вот что я нашел. Но, правда, на себе еще не пробовал. Но должно работать.

TL; DR: я думаю, вам нужно добавить "--exclude=node_modules" на ваш rsync_opts с точки зрения Ansible.

Если вы читаете rsync руководство, вы увидите сводку этих параметров

            --delete                delete extraneous files from dest dirs
            --delete-before         receiver deletes before xfer, not during
            --delete-during         receiver deletes during the transfer
            --delete-delay          find deletions during, delete after
            --delete-after          receiver deletes after transfer, not during
            --delete-excluded       also delete excluded files from dest dirs

Опция --delete-excluded интересно.

--delete-excluded
              In  addition  to deleting the files on the receiving side that
              are not on the sending side, this tells rsync to  also  delete
              any  files  on  the  receiving  side  that  are  excluded (see
              --exclude).  See the FILTER RULES section for a  way  to  make
              individual exclusions behave this way on the receiver, and for
              a way to protect files from --delete-excluded.   See  --delete
              (which is implied) for more details on file-deletion.

но на самом деле он вам не нужен, конечно, за исключением того, что он ссылается на --exclude вариант, который вам нужен.

--exclude=PATTERN
              This option is a simplified form of the --filter  option  that
              defaults  to  an  exclude  rule  and  does  not allow the full
              rule-parsing syntax of normal filter rules.

              See the FILTER RULES section for detailed information on  this
              option.

Добавить "--exclude=node_modules" на ваш rsync_opts.