Ответ 1
-
Это зависит от наличия двух типов наследования, и вы не говорите, что вы имеете в виду.
-
Node Наследование: наследование от одного определения
node fqdn { }
другому. Это, в частности, настоятельно рекомендуется против, поскольку он имеет тенденцию терпеть неудачу принцип наименьшего удивления. Классический пример, который улавливает людей, таков:node base { $mta_config = "main.cf.normal" include mta::postfix # uses $mta_config internally } node mailserver inherits base { $mta_config = "main.cf.mailserver" }
Переменная
$mta_config
оценивается в базовой области, поэтому "переопределение", которое выполняется в почтовом сервере, не работает.Невозможно напрямую повлиять на то, что в родительском node, так что мало пользы от композиции. Этот пример можно было бы устранить, удалив наследование и включив
mta::postfix
(или другой "общий" / "базовый" класс) из обоих. Затем вы могли бы использовать параметризованные классы. -
Наследование классов: использование для наследования классов заключается в том, что вы можете переопределить параметры ресурсов, определенных в родительском классе. Переопределив приведенный выше пример таким образом, получим:
class mta::postfix { file { "/etc/postfix/main.cf": source => "puppet:///modules/mta/main.cf.normal", } service { ... } } class mta::postfix::server inherits mta::postfix { File["/etc/postfix/main.cf"]: source => "puppet:///modules/mta/main.cf.server", } # other config... }
Это работает, но я бы избегал идти более чем на один уровень наследования, поскольку он становится головной болью для поддержания.
-
В обоих этих примерах их легко улучшить, указав данные заблаговременно (через ENC) или запросив данные inline через extlookup или hiera.
-
-
Надеемся, что приведенные выше примеры помогут. Наследование классов позволяет только переопределять параметры - вы не можете удалить ранее определенные ресурсы (общий вопрос). Всегда ссылайтесь на ресурс с именем заглавного типа (
file { ..: }
станетFile[..]
).Также полезно, что вы также можете определить параметры как
undef
, эффективно отключив их.