У меня есть такой узел по умолчанию:
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 на самом деле не предоставляет столько гарантий с точки зрения порядка анализа / оценки.