Bacula使用variables重用FileSet资源

我在不同的服务器上有相同的应用程序的几个环境。 目录结构非常相似,所以我想为它们全部使用一个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,它似乎正在工作,所以在这里:

举个例子,假设我们有以下工作:

  • server1的-ENV1在职
  • 服务器2-ENV2在职
  • 服务器2-ENV3在职

然后假定–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是:

  1. 在每台机器上使用相同的目录结构
    这是Bacula的立场最实际的解决scheme。 它需要Baculaconfiguration文件中最less的额外工作,并且如果您的应用程序是“相同的”,则最有意义。

  2. 每台机器使用一个文件集
    这比选项(1)更烦人,因为你现在正在维护一堆几乎相同的文件集。 这是最实际的,如果你生成你的Baculaconfiguration与其他一些可以自动创build文件集的进程。

  3. 使用一个列出所有目录的文件集
    这是有效的,但是每当你添加一台新机器(因此新的env#目录),你将会改变全局文件集并触发完整的备份。

  4. 使用ClientRunBeforeJob指令将文件放在统一的位置
    这是有点肮脏,但它的工作原理 – 在进行备份之前,让Bacula rsync将应用程序环境移动到另一个位置。 (如果你在Linux系统上,你也可以使用mount --bind把应用程序放在一个统一的位置,而不会影响其他任何东西。)
    这种方法的主要缺点是你的存储需求加倍:你有应用程序正在运行的生产副本,以及Bacula制作的影子副本,以便进行备份。