Обычно я использую при автоматической установке - noreboot --noautoconsole
что в значительной степени покрывает полностью автоматическую установку. При этом, как правило, быстрее и лучше использовать virt-builder
вместо virt-install
, поскольку команда более стабильна, а обработка изображений выполняется быстрее и согласованнее, чем полная объемная установка ОС. С готовым шаблоном образа виртуальной машины все происходит даже быстрее, чем этот.
Возможно, вы могли бы использовать опцию -M
(длинная версия --remote-option
), которая, похоже, не проверяется клиентом rsync. -M-xxx
передается на
remote с -M
, зачеркнутым как -xxxx
. Вы можете легко поиграть с этим, используя -M-M-xxxx
, который игнорируется клиентом и удаленным:
rsync -av -M-M-myvar=val /tmp/test/ remote:test/
Если ваш сервер распознает и удалит результирующие флаги перед вызовом rsync, вы получите то, что вам нужно.
Вы можете играть дальше с --rsync-path
, который позволяет вам запустить любой скрипт. Он получит конкатенированные удаленные args. Например,
rsync -a -M-myvar=val --rsync-path='echo hello >/tmp/out; ./mysync' /tmp/test/ remote:test/
запустит на удаленном компьютере что-то вроде
echo hello >/tmp/out
./mysync --server -logDtpre.iLsfx -myvar=val . test/
Это не совсем красиво, но все это можно спрятать в сценарии:
SSH может отправлять произвольные переменные среды через туннель; и клиент, и сервер должны быть настроены для этого. Клиент легко сделать с опцией -o
; сервер, который необходимо указать в файле sshd_config
. Принимать произвольные - плохая идея, но должно сработать что-то вроде этого:
BACKUP_PROVIDER_VAR1=val1 rsync -e 'ssh -o SendEnv=BACKUP_PROVIDER_*' …
Затем вам нужно будет поместить AcceptEnv LANG LC_ * BACKUP_PROVIDER _ *
в свой sshd_config
(который, насколько я знаю, может быть ограничен только определенным пользователем / группой с блоком Match
). На самом деле, вам, вероятно, не нужны LANG
или LC _ *
из ваших клиентов резервного копирования, поэтому вам просто нужны ваши собственные пользовательские переменные окружения.
Начиная с версии rsync 3.1.0, аргумент - remote-option
(или его сокращенная форма -M
) доступен для передачи аргументов серверу. Например, предоставление клиенту команды:
$ rsync -av -M --customarg1=value1 -M --customarg2=value2 file1 file2 user@server:some/path
приведет к тому, что серверная команда получит аргументы с префиксом -M
, но без -M
, в SSH_ORIGINAL_COMMAND
переменная.Примерно так:
rsync --server -vnlogDtpre.iLsfxC --customarg1=value1 --customarg2=value1 . some/path
Пользовательские аргументы должны быть обработаны и удалены из командной строки перед вызовом серверной rsync (в противном случае он завершится с ошибкой, потому что он их не распознает). Один из способов сделать это - сопоставление регулярного выражения:
rsync_cmd="$SSH_ORIGINAL_COMMAND"
[[ "$rsync_cmd" =~ --customarg1=([a-zA-Z0-9]+) ]] && customarg1=${BASH_REMATCH[1]}
[[ "$rsync_cmd" =~ --customarg2=([a-zA-Z0-9]+) ]] && customarg2=${BASH_REMATCH[1]}
rsync_cmd=$(sed -re 's/--(customarg1|customarg2)=[a-zA-Z0-9]+//g' <<< $rsync_cmd)
(пример сопоставления регулярного выражения позволяет параметру быть буквенно-цифровым)
Одно предостережение заключается в том, что он не работает, если клиенту rsync присвоено значение -s
(или - protect-args
), потому что это вызывает внутреннюю передачу аргументов между клиентом rsync и сервером - они не отображаются в оболочке, не включены в $ SSH_ORIGINAL_COMMAND
, и поэтому не может быть изменен.
Альтернативный метод - использовать - rsync-path
для передачи настраиваемых аргументов. Этот метод работает со старыми версиями rsync, в которых отсутствует -M
, а также с параметром - protect-args
:
$ rsync --rsync-path='rsync --customarg1=value1 --customarg2=value2' -av file1 file2 user@server:some/path