Я собираюсь использовать CFEngine на некоторых серверах Linux.
Моя проблема в том, что мне нужно иметь возможность применять отдельные политики в зависимости от сервера. Я просмотрел всю их документацию и не нашел нигде, где говорится, что это можно или нельзя сделать.
Возможно ли это с помощью CFEngine? Или мне стоит поискать в другом месте.
Вы можете использовать классы, чтобы определить, где будут применяться политики, и по умолчанию Cfengine создает класс с именем хоста каждого запущенного сервера.
Например, в следующем обещании, если имя хоста сервера - server01, Cfengine сообщит «Hello master» (проверьте системный журнал, чтобы прочитать отчеты), если имя хоста - server02, Cfengine сообщит «Hello slave»:
body common control
{
bundlesequence => { "hello" };
}
bundle agent hello
{
reports:
server01::
"Hello master!"
comment => "It's just a dummy report for server01";
server02::
"Hello slave!"
comment => "It's just a dummy report for server02";
}
Пс. Вы можете запустить этот пример политики из файла hello.cf с помощью:
cf-agent -I -f hello.cf
Вы можете найти больше информации о классах и операциях с их использованием в официальные документы.
Давненько мы не использовали CFengine, но мы столкнулись с аналогичной проблемой, когда использовали его. Наконец, мы пришли к решению, используя динамическую последовательность пакетов. Я спасаю и изменяю старый фрагмент кода, поэтому синтаксис может быть неправильным, но я думаю, что вы поймете идею.
bundle common g {
classes:
"some_servers" expression => "someserver01|someserver02";
"another_servers" expression => "anotherserver01|anotherserver02";
# Define other classes for your hosts here as needed
vars:
any::
"bs_common" slist => {
"bundle_1"
};
some_servers::
"bs" slist => {
"@(g.bs_common)",
"bundle_2",
"bundle_3",
};
another_servers::
"bs" slist => {
"@(g.bs_common)",
"bundle_3",
};
}
body control common {
bundlesequence => {
"@(g.bs)",
};
}