Почему основной класс модуля Puppet должен быть включен подклассом? - PullRequest
1 голос
/ 02 апреля 2020

Во многих областях в модуле puppetlabs / apache, таких как vhost.pp , вы можете увидеть обработку ошибок, которая требует, чтобы базовый класс был включен первым, потому что рассматриваемый класс использует базовый класс в своем ' значения параметров по умолчанию.

Здесь в dev.pp нет параметров, хотя вы можете видеть ссылку на $::apache::dev_packages, который объявлен классом ::apache::params при инициализации ::apache.

Однако, в vhosts.pp вы можете видеть, что базовый класс включен явно, без ожидания того, что он был включен ранее.

Мое понимание этого состоит в том, что apache::vhosts предназначен для использования в качестве отдельного класса, и его включение ::apache инициализирует конфигурацию Apache по умолчанию, определенную модулем. Однако, если Apache объявлено в другом месте, например:

class { '::apache':
  *params*
}

, то включение базового класса использует любые значения, переданные в качестве аргументов базовому классу. Это верно? Почему два опубликованных c класса apache::vhosts и apache::dev имеют два разных требования к использованию?

1 Ответ

0 голосов
/ 03 апреля 2020

Почему основной класс модуля 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 в случаях, которые в любом случае потерпят неудачу, но за счет произвольного отказа в других случаях, когда вместо этого может работать просто.

...