我在不同的服务器上有多个相同应用程序的环境。目录结构非常相似,所以我想为它们全部使用一个 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"
...
}
答案1
经过几天的解决方案,它似乎起作用了,因此如下所示:
按照这个例子,假设我们有以下工作:
- 服务器1-环境1-作业
- 服务器2-环境2-作业
- 服务器2-环境3-作业
然后假设 --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\""
}
}
有关文件集中命令执行的更多信息,请查看文档
完整备份和增量备份运行正常。
答案2
我不相信你能做到这一点——Bacula 的配置文件是配置文件,而不是编程语言或 shell。
您实际的选择是:
在每台机器上使用相同的目录结构
从 Bacula 的角度来看,这是最实用的解决方案。它只需要在 Bacula 配置文件中进行最少的额外工作,并且如果您的应用程序“相同”,那么这是最有意义的。每台机器使用一个文件集
这比选项 (1) 更烦人,因为你现在要维护一堆几乎相同的文件集。如果你使用其他可以自动创建文件集的进程来生成 Bacula 配置,那么这是最实用的。使用一个文件集列出所有目录
这是可行的,但是每当您添加新机器(从而添加新env#
目录)时,您都将更改全局文件集并触发完整备份。使用
ClientRunBeforeJob
指令将文件放在统一的位置
这有点不妥,但确实有效——rsync
在备份之前,让 Bacula 将应用程序环境移到另一个位置。(如果您使用的是 Linux 系统,您也可以将mount --bind
应用程序放在统一的位置,而不会影响其他任何内容。)
这种方法的主要缺点是您需要双倍的存储需求:您有应用程序的运行生产副本,以及 Bacula 为进行备份而制作的影子副本。