Назад | Перейти на главную страницу

Bacula использует переменную для повторного использования ресурса 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"
  ...
}

Через несколько дней с решением, похоже, он работает, так что вот оно:

Допустим, у нас есть следующие рабочие места:

  • server1-env1-job
  • server2-env2-job
  • server2-env3-job

Тогда, предполагая --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 - это Файл конфигурации, а не язык программирования или оболочку.

Ваши практические варианты:

  1. Используйте идентичные структуры каталогов на каждой машине
    Это наиболее практичное решение с точки зрения Bacula. Это требует наименьшей дополнительной работы с файлом конфигурации Bacula, и если ваши приложения «идентичны», это имеет наибольший смысл.

  2. Использовать набор файлов для каждой машины
    Это раздражает больше, чем вариант (1), так как теперь вы поддерживаете кучу почти идентичных наборов файлов. Это наиболее практично, если вы создаете конфигурацию Bacula с помощью другого процесса, который может автоматически создавать наборы файлов.

  3. Используйте один набор файлов со списком всех каталогов
    Это работает, но каждый раз, когда вы добавляете новую машину (и, следовательно, новую env# directory) вы будете изменять глобальный набор файлов и запускать полные резервные копии.

  4. Использовать ClientRunBeforeJob директива для размещения файлов в едином месте
    Это немного грязно, но работает - есть Bacula rsync среду приложения в другое место перед выполнением резервного копирования. (Если вы работаете в системе Linux, вы также можете использовать mount --bind чтобы разместить приложение в одном месте, не влияя ни на что другое.)
    Основным недостатком этого подхода является то, что вы удваиваете свои требования к хранилищу: у вас есть работающая производственная копия приложения и теневая копия, которую Bacula создает для резервного копирования.