Почему основной класс модуля Puppet должен включаться в подкласс?
Прежде всего, это не базовые и не подклассы. У Puppet есть наследование классов, но apache::dev
не использует его, а apache::vhost
даже не класс (это определенный тип). Класс apache
- это «основной» класс модуля, а apache::dev
- просто другой класс в том же модуле.
Практически единственное хорошее применение для наследования классов - это поддержка получения значений параметров класса по умолчанию от другого. переменные класса, но очевидно, что люди, контролирующие онлайн-документы Puppet, больше не считают это хорошей идеей (хотя вы все еще можете увидеть пример в классе apache
). Поддержка Hiera данных в модулях - достойная альтернатива, но я иногда думаю, что Puppet, In c. слишком очарован их блестящими новыми вкусностями и слишком пренебрежительно относится к старым функциям, которые прекрасно работают, когда используются как документированные, но к сожалению ломаются при неправильном использовании.
Здесь в dev.pp нет параметров
... и без включения в класс apache
. Но - это код , который приведет к сбою построения каталога в случае, если apache
еще не был объявлен отдельно.
Однако в vhosts.pp вы можете видеть, что базовый класс включен явно без ожидания, что он был включен ранее.
Да, это вполне нормально. Действительно, более нормальное поведение, чем apache::dev
. apache::vhost
предназначен для публичного использования c, поэтому, если вы объявляете экземпляр, он гарантирует, что все, что ему нужно, также включено в каталог.
Насколько я понимаю, apache::vhosts
предназначен для использования в качестве отдельного класса, и его включение ::apache
инициализирует конфигурацию Apache по умолчанию, определенную модулем.
Не совсем. apache::vhost
- это , предназначенный для публикации типа c, и он объявляет ::apache
, чтобы гарантировать, что все необходимое для его поддержки действительно управляется. Вы можете охарактеризовать это как «автономный», если хотите. Но включение ::apache
там ничем не отличается от того же нигде. Если этот класс уже добавлен в каталог, то он не имеет никакого дополнительного эффекта. В противном случае добавляется с параметрами, взятыми из данных Hiera, где такие данные параметров определены , и жестко заданными значениями по умолчанию, где нет. Hiera - это то, как должен , как правило, настраивать параметры класса, и где это делается, результирующая конфигурация apache точно не определяется как "по умолчанию" или определяется модулем.
Однако, если Apache объявлено в другом месте, например:
class { '::apache':
*params*
}
, то при включении базового класса используются любые значения, переданные в качестве аргументов базовому классу.
Если такое объявление класса ресурса уже было оценено , то, как я уже сказал, объявление включения типа 1058 * не имеет никакого дополнительного эффекта. Но если такое объявление класса ресурсов оценивается позже , то создание каталога завершится неудачей. Это одна из основных причин избегать ресурсоподобных объявлений классов и использования привязки данных через Hiera для настройки параметров класса.
Зачем нужны два publi c class apache :: vhosts и apache :: dev имеет два различных требования к использованию?
Поскольку модуль разрабатывался сотнями авторов в течение нескольких лет. Не удивительно, что это привело к некоторой несогласованности. Тем более, что даже разработчики Puppet, которые вносят свой вклад в модули, находятся в разных точках на пути к просветлению.
Единственное правдоподобное оправдание для предпочтения подхода apache::dev
состоит в том, чтобы не вмешиваться в ресурсоподобное объявление класса apache
, который оценивается позже, но предотвращение такого сбоя путем принудительного вызова другого сбоя не является большим преимуществом. Это дает возможность предоставить более четкую диагностику c в случаях, которые в любом случае потерпят неудачу, но за счет произвольного отказа в других случаях, когда вместо этого может работать просто.