我在不同的服务器上有相同的应用程序的几个环境。 目录结构非常相似,所以我想为它们全部使用一个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" ... }
经过几天的解决scheme,它似乎正在工作,所以在这里:
举个例子,假设我们有以下工作:
然后假定–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的configuration文件是一个configuration文件 ,而不是编程语言或shell。
你的实际select是:
在每台机器上使用相同的目录结构
这是Bacula的立场最实际的解决scheme。 它需要Baculaconfiguration文件中最less的额外工作,并且如果您的应用程序是“相同的”,则最有意义。
每台机器使用一个文件集
这比选项(1)更烦人,因为你现在正在维护一堆几乎相同的文件集。 这是最实际的,如果你生成你的Baculaconfiguration与其他一些可以自动创build文件集的进程。
使用一个列出所有目录的文件集
这是有效的,但是每当你添加一台新机器(因此新的env#目录),你将会改变全局文件集并触发完整的备份。
使用ClientRunBeforeJob指令将文件放在统一的位置
这是有点肮脏,但它的工作原理 – 在进行备份之前,让Bacula rsync将应用程序环境移动到另一个位置。 (如果你在Linux系统上,你也可以使用mount --bind把应用程序放在一个统一的位置,而不会影响其他任何东西。)
这种方法的主要缺点是你的存储需求加倍:你有应用程序正在运行的生产副本,以及Bacula制作的影子副本,以便进行备份。