Я использую 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
Это работает. Однако, после того как я создаю a node_modules
папка на сервере...
app/
test/
node_modules/
package.json
... и выполненный синхронизация снова, node_modules
- папка удалена из сервера снова (даже при том, что я исключил его в своем .rsync-фильтре):
app/
test/
package.json
Я ожидаю node_modules
- папка, которая будет сохранена на сервере, потому что мне перечислили его в моем .rsync-filter
и не использую --delete-excluded
опция.
Как я могу препятствовать тому, чтобы мои исключенные файлы/каталоги были удалены с rsync?
Большое спасибо за Вашу справку!:)
-FF -FF
является причиной вашей проблемы. Это останавливает копирование файла -rsync-filter
и, как сказано в man-странице 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
.