Существует ли простой способ для cfengine3 копировать разные файлы в зависимости от операционной системы - PullRequest
1 голос
/ 14 октября 2011

У меня есть две разные версии linux / unix, каждая из которых работает cfengine3.Можно ли иметь один файл promises.cf, который я могу разместить на обеих машинах, который будет копировать разные файлы в зависимости от того, что на клиентских компьютерах?Я искал в интернете несколько часов и пока не нашел ничего полезного.

1 Ответ

4 голосов
/ 24 января 2012

Есть несколько способов сделать это.Самое простое, вы можете просто иметь разные файлы: обещания в зависимости от операционной системы, например:

files:
  ubuntu_10::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.ubuntu_10");
  suse_9::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.suse_9");
  redhat_5::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.redhat_5");
  windows_7::
    "/etc/hosts"
      copy_from => mycopy("$(repository)/etc.hosts.windows_7");

Этот пример можно легко упростить, если понять, что встроенная переменная CFEngine $ (sys.flavor)) содержит тип и версию операционной системы, поэтому мы могли бы переписать этот пример следующим образом:

"/etc/hosts"
    copy_from => mycopy("$(repository)/etc.$(sys.flavor)");

Более гибкий способ решения этой задачи известен в терминологии CFEngine как " иерархическая копия «.В этом шаблоне вы указываете произвольный список переменных, по которым вы хотите, чтобы файлы различались, и порядок, в котором они должны рассматриваться, от самых специфических до самых общих.Когда обещание копирования будет выполнено, будет скопирован самый специфический найденный файл.

Этот шаблон очень прост в реализации:

# Use single copy for all files
body agent control
{
   files_single_copy => { ".*" };
}

bundle agent test
{
vars:
  "suffixes"   slist => { ".$(sys.fqhost)", ".$(sys.uqhost)", ".$(sys.domain)",
                          ".$(sys.flavor)", ".$(sys.ostype)", "" };
files:
  "/etc/hosts"
    copy_from => local_dcp("$(repository)/etc/hosts$(suffixes)");
}

Как видите, мы определяем списокпеременная с именем $ (суффиксы), которая содержит критерии, по которым мы хотим дифференцировать файлы.Все переменные, содержащиеся в этом списке, автоматически определяются CFEngine, хотя вы можете использовать любые произвольные переменные CFEngine.Затем мы просто включаем эту переменную, как скаляр, в наш параметр copy_from.Поскольку CFEngine выполняет автоматическое расширение списка, он по очереди пробует каждую переменную, выполняя обещание копирования (по одному для каждого значения в списке) и копирует первый существующий файл.Например, для машины Linux SuSE 11 с именем superman.justiceleague.com переменная @ (суффиксы) будет содержать следующие значения:

{ ".superman.justiceleague.com", ".superman", ".justiceleague.com", ".suse_11",
  ".linux", "" }

Когда выполняется обещание копирования файла, неявное зацикливание вызываетэти строки должны быть добавлены в последовательности к «$ (хранилище) / etc / hosts», поэтому следующие имена файлов будут пытаться последовательно: hosts.superman.justiceleague.com, hosts.justiceleague.com, hosts.suse_11, hosts.linuxи хозяева.Первый из существующих будет скопирован через / etc / hosts в клиенте, а остальные будут пропущены.

Чтобы этот метод работал, мы должны включить «одну копию» для всех файлов, которые вы хотитеобрабатывать.Это параметр конфигурации, который указывает CFEngine копировать каждый файл не более одного раза, игнорируя последовательные операции копирования для одного и того же файла назначения.Параметр files_single_copy в теле элемента управления агента указывает список регулярных выражений, соответствующих именам файлов, к которым должна применяться единичная копия.Установив для него значение ".*", мы сопоставляем все имена файлов.

Для хостов, которые не соответствуют ни одному из существующих файлов, последний элемент в списке (пустая строка) приведет к тому, что общий файл хостов будетскопировано.Обратите внимание, что точка для каждого из имен файлов включена в $ (суффиксы), за исключением последнего элемента.

Надеюсь, это поможет.

(пс и бесстыдный плагин: это взято измоя будущая книга " Learning CFEngine 3 ", изданная O'Reilly)

...