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

В Puppet, как лучше всего указать, что пара классов взаимоисключающая?

У меня есть такой узел по умолчанию:

node default {
    include test_server
    # A bunch of other irrlevant includes
}

Тогда у меня есть такая спецификация узла:

node linus inherit default {
    include production_server
}

Я хочу исключить test_server и имеют production_server поскольку они исключают друг друга.

Как мне этого добиться?

Лучше создать класс под названием servertype и различать его по параметру.

class servertype($testing = false) {
  if ($testing) {
     ... resources from your testing class ...
  } else {
     ... resources from your production class ...
  }
}

Вообще говоря, используя ENC (Классификатор внешних узлов) - лучший вариант для применения классов к хостам, а не к файлам узлов. Вы можете создать «Hostgroups», где каждая группа имеет несколько классов. Таким образом можно избежать наследования. Доступно несколько ENC, поэтому вам не нужно создавать свои собственные.

В Puppet нет понятия «исключить»; как только вы что-то добавили, оно уже включено. Лучшее, что вы можете сделать, - это создать один класс, который вы включаете, который внутренне выполняет диспетчеризацию, чтобы включать либо test_server или production_serverв зависимости от обстоятельств (посмотрите на факт, посмотрите на переданную переменную и т. д.).

Если этого не сделать, вы можете вызвать ошибку, если оба класса включены. Легкий способ сделать это - просто включить ресурс дозорного устройства в каждый класс, где ресурс имеет одинаковое имя в обоих местах:

notice { unused:
  loglevel => debug,
}

Попытка включить оба класса приведет к сбою компилятора, что предотвратит компиляцию каталога.

Другой вариант - использовать defined функция в каждом классе, чтобы проверить, определен ли другой уже. Если так, fail:

if defined(Class["test_server"]) {
  fail "Can't include test_server and production_server at the same time"
}

defined однако имеет некоторую специфическую семантику, так как она зависит от порядка, а Puppet на самом деле не предоставляет столько гарантий с точки зрения порядка анализа / оценки.