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

Как конкретный клиент получает политику с сервера cfengine

Я работаю над CFEngine, но я новичок в этой концепции. для моего требования я использую один сервер, и я использую 10 клиентов, теперь все десять клиентов извлекают политику с сервера и выполняют политики.

Но мое требование заключается в том, что политика применима только для одного клиента из 10, как может конкретный клиент только извлекать политики и выполнять их.

Пожалуйста, дайте мне предложение, я очень запутался в этом ..

Спасибо

Ответ Maciejmrowiec хороший, но неполный; CFEngine не обязан иметь одинаковые обещания на ВСЕХ ваших узлах; но это поведение по умолчанию

Есть два способа добиться того, чего вы хотите:

  1. Повсюду иметь одни и те же обещания (реализация по умолчанию) и с помощью классов контролировать, какой хост что делает (и для этого я отсылаю вас к ответу maciejmrowiec, который является довольно исчерпывающим по теме)
  2. У разных систем разные обещания. Есть причина, по которой вы не хотите, чтобы во всей системе были одни и те же промисы: секрет, которым вы не хотите делиться, среда test / preprod / prod (возня с тестовыми обещаниями не должна нарушить производство). Таким образом, вы можете иметь разные наборы обещаний и хранить их в разных папках на сервере политики (например, / var / cfengine / masterfiles / folder1 и / var / cfengine / masterfiles / folder2); и настройте cf-сервер для предоставления доступа к этой папке только нужным хостам

    bundle server access_rules() {
      access:
        "/var/cfengine/masterfiles/share/folder1"
            admit => { "host1", "host2", "host3" };
    
        "/var/cfengine/masterfiles/folder2"
           admit   => { "host55" };
    }
    

И пусть файл update.cf скопирует обещание из нужного места

    host55::
      "$(sys.workdir)"
        copy_from =>u_rcp("/var/cfengine/masterfiles/folder2", "$(sys.policy_hub)");


    !host55::
      "$(sys.workdir)"
        copy_from =>u_rcp("/var/cfengine/masterfiles/folder1", "$(sys.policy_hub)");

Как я правильно понимаю, вы хотите контролировать, какая политика должна переходить к конкретному узлу для выполнения?

CFEngine работает таким образом, что ВСЕ политики распространяются на ВСЕХ клиентов и выполняются. Для управления тем, что выполняется на какой машине, в языке политик cfengine есть механизм, который называется классами контекста.

Классы контекста - это просто системные атрибуты, которые могут иметь 2 состояния - существовать или нет. Например, ваша машина является системой debian, тогда для выполнения политики на всех ваших системах debian вы должны использовать этот класс для области, где она должна применяться. Существуют жесткие классы, которые cfengine обнаруживает автоматически, и вы можете установить свои собственные. Чтобы указать конкретную машину, вы можете использовать IP, MAC или имя хоста, которые также задаются как классы.

Почему вам нужно распространять все политики на всех клиентов? Некоторые системные атрибуты менее постоянны, чем операционная система или имя хоста. Классы могут зависеть от запущенной службы или загрузки ЦП, заполнения жесткого диска и т. Д. Тогда вам нужно иметь всю политику, чтобы знать, что делать с изменением среды, поскольку классы устанавливаются каждый раз, когда вы хотите запустить свою политику.

Как использовать классы контекста? Вот пример простой политики:

bundle agent my_test
{
 files:
  debian::            #hardclass
   "/tmp/file1"
    create => "true";

  redhat::             #hardclass
   "/tmp/file2"
    create => "true";
}  

Эта политика создаст / tmp / file1 во всех системах debian и / tmp / file2 во всех системах redhat.

Вы можете использовать логические выражения, такие как ipv4_192_168_122_116.cpu_high, которые говорят, что запускается на хосте с IP 192.168.122.116 И загрузка процессора на этом компьютере высока.

Чтобы получить еще несколько интересных примеров, попробуйте здесь: https://github.com/cfengine/design-center/tree/master/examples

и справочное руководство всегда является хорошим ориентиром: http://cfengine.com/manuals/cf3-Reference#Decisions

Чтобы перечислить классы, которые устанавливаются на вашем текущем компьютере, вы можете использовать cf-promises -v

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