У меня есть несколько сред одного и того же приложения на разных серверах. Структура каталогов очень похожа, поэтому я хотел бы использовать один-единственный FileSet для всех из них. Например:
- server1: /opt/env1/app/logs
- server1: /opt/env1/app/bin
- server1: /opt/env1/app/temp
- server1: /opt/env1/app/lib
- server2: /opt/env2/app/logs
- server2: /opt/env2/app/bin
- server2: /opt/env2/app/temp
- server2: /opt/env2/app/lib
- server2: /opt/env3/app/logs
- server2: /opt/env3/app/bin
- server2: /opt/env3/app/temp
- server2: /opt/env3/app/lib
Я бы хотел что-то вроде:
FileSet {
Name = "APP"
Include {
Options {
signature = MD5
Compression = GZIP
}
File = "/opt/${env}/app"
}
Exclude {
File = "/opt/${env}/app/logs"
File = "/opt/${env}/app/temp"
}
}
Затем:
Job {
Name = "JOBENV1"
#somehow set env variable as env1
FileSet="APP"
...
}
Job {
Name = "JOBENV2"
#somehow set env variable as env2
FileSet="APP"
...
}
Job {
Name = "JOBENV3"
#somehow set env variable as env3
FileSet="APP"
...
}
Через несколько дней с решением, похоже, он работает, так что вот оно:
Допустим, у нас есть следующие рабочие места:
Тогда, предполагая --job как соглашение, набор файлов должен выглядеть так:
FileSet {
Name = "someapp-fileset"
Include {
Options {
signature = MD5
Compression = GZIP
}
File = "| bash -c \"echo %n | awk -F '-' '{print \$2}' | xargs -I ARG echo /opt/ARG\""
}
Exclude {
File = "| bash -c \"echo %n | awk -F '-' '{print \$2}' | xargs -I ARG echo /opt/ARG/temp\""
File = "| bash -c \"echo %n | awk -F '-' '{print \$2}' | xargs -I ARG echo /opt/ARG/logs\""
}
}
Дополнительные сведения о выполнении команд в наборе файлов см. В документация
Полное и инкрементное резервное копирование выполняется нормально.
Я не верю, что вы сможете это сделать - файл конфигурации Bacula - это Файл конфигурации, а не язык программирования или оболочку.
Ваши практические варианты:
Используйте идентичные структуры каталогов на каждой машине
Это наиболее практичное решение с точки зрения Bacula. Это требует наименьшей дополнительной работы с файлом конфигурации Bacula, и если ваши приложения «идентичны», это имеет наибольший смысл.
Использовать набор файлов для каждой машины
Это раздражает больше, чем вариант (1), так как теперь вы поддерживаете кучу почти идентичных наборов файлов. Это наиболее практично, если вы создаете конфигурацию Bacula с помощью другого процесса, который может автоматически создавать наборы файлов.
Используйте один набор файлов со списком всех каталогов
Это работает, но каждый раз, когда вы добавляете новую машину (и, следовательно, новую env#
directory) вы будете изменять глобальный набор файлов и запускать полные резервные копии.
Использовать ClientRunBeforeJob
директива для размещения файлов в едином месте
Это немного грязно, но работает - есть Bacula rsync
среду приложения в другое место перед выполнением резервного копирования. (Если вы работаете в системе Linux, вы также можете использовать mount --bind
чтобы разместить приложение в одном месте, не влияя ни на что другое.)
Основным недостатком этого подхода является то, что вы удваиваете свои требования к хранилищу: у вас есть работающая производственная копия приложения и теневая копия, которую Bacula создает для резервного копирования.