Puppet: Class Ordering / Containment - всегда неправильный порядок - PullRequest
0 голосов
/ 27 сентября 2019

Я много читал о том, как заказывать кукольные классы с защитой (я использую Puppet 6).Но это все еще не работает для меня в одном случае.Возможно, мой английский недостаточно хорош, и я что-то пропустил.Возможно, кто-то знает, что я делаю неправильно.

У меня есть профиль для установки сервера puppetserver (profile::puppetserver).В этом профиле есть три подкласса, которые я содержит в пределах profile::puppetserver

class profile::puppetserver(
) {
  contain profile::puppetserver::install
  contain profile::puppetserver::config
  contain profile::puppetserver::firewall
}

. Это прекрасно работает для меня.Теперь я хочу расширить этот профиль и установить PuppetDB.Для этого я использую модуль puppetdb из puppet forge :

Так что я добавляю profile::puppetserver::puppetdb и содержимое к profile::puppetserver

class profile::puppetserver::puppetdb(
) {

  # Configure puppetdb and its underlying database
  class { 'puppetdb': }

  # Configure the Puppet master to use puppetdb
  class { 'puppetdb::master::config': }
}

  1. Когда я сначала инициализирую puppetserver и добавляю profile::puppetserver::puppetdb после него, puppetdb устанавливается и все работает нормально.

  2. Если я добавляю егонепосредственно с contain, и при подготовке всего сразу происходит сбой.Это потому, что модуль puppetdb устанавливается случайным образом во время установки моего главного сервера (а также сервера postgresql и т. Д.).Это заканчивается тем, что мой puppetserver не работает, а мои puppetdb не генерируют локальные ssl сертификаты, а служба не запускается.

Что я пробую сначала:

Я установил пакет puppetdb непосредственно в profile::puppetserver::puppetdb и использовал требуемый флаг.Это работает, когда я готовлю все сразу.

class profile::puppetserver::puppetdb (
) {

  Package { 'puppetdb':
    ensure => installed,
    require => Class['profile::puppetserver::config']
  }
}

Так что я думаю, что мог бы сделать то же самое в приведенном выше коде:

class profile::puppetserver::puppetdb(
) {

  # Configure puppetdb and its underlying database
  class { 'puppetdb': 
    require => Class['profile::puppetserver::config']
  }

  # Configure the Puppet master to use puppetdb
  class { 'puppetdb::master::config': 
    require => Class['profile::puppetserver::config']
  }
}

Но это не работает ...

Итак, я читал о сдерживании и упорядочении классов кукол по цепочкам.Так что я сделал это в моем profile::puppetserver

class profile::puppetserver(
) {
  contain profile::puppetserver::install
  contain profile::puppetserver::config
  contain profile::puppetserver::firewall
  contain profile::puppetserver::puppetdb

  Class['profile::puppetserver::install'] ->
  Class['profile::puppetserver::config'] ->
  Class['profile::puppetserver::firewall'] ->
  Class['profile::puppetserver::puppetdb']
}

Но это все равно не имеет никакого эффекта ... он все еще начинает устанавливать postgresql и пакет puppetdb во время моей "подготовки puppetserver" вшаги по установке, настройке, брандмауэру.

Как мне написать порядок, чтобы все элементы из модуля puppetdb, который я вызываю в profile::puppetserver::puppetdb, запускались только после завершения остальных этапов подготовки?

Я действительно не понимаю этого.Я думаю, может быть, это как-то связано с тем, что я объявляю классы из модуля puppetdb внутри profile::puppetserver::puppetdb, а не напрямую Resource Type.Потому что, когда я использую Package Resource Type с флагом Require, это, кажется, работает.Но я действительно не знаю, как справиться с этим.Я думаю, что должен быть способ или?

1 Ответ

2 голосов
/ 28 сентября 2019

Я думаю, что, возможно, это как-то связано с тем, что я объявляю классы из модуля puppetdb внутри профиля :: puppetserver :: puppetdb, а не напрямую из Типа ресурса.Потому что, когда я использую Тип ресурса пакета с флагом Require, он работает.

Именно так.

Ресурсы упорядочены с экземпляром класса или определенного типа, который напрямую объявляетих, а также в соответствии с параметрами упорядочения и инструкциями, применяемыми к ним напрямую.

Поскольку классы могут быть объявлены несколько раз, в разных местах упорядочение для них сложнее.Подобные ресурсам объявления классов, которые вы демонстрируете (и которых вам действительно следует избегать как можно больше), не подразумевают какого-либо конкретного упорядочения объявленного класса.Кроме того, объявления с помощью функции include.

Объявления классов с помощью функции require накладывают одностороннее ограничение порядка на объявленный класс относительно объявленного класса или определенного типа, а объявления с помощью contain Функция помещает двустороннее ограничение порядка, аналогичное тому, которое применяется ко всем объявлениям ресурсов.Стрелки и метапараметры упорядочения могут накладывать дополнительные ограничения на упорядочение классов.

Но я действительно не знаю, как с этим справиться.Я думаю, что должен быть способ или?

Ваш последний пример демонстрирует жизнеспособный способ обеспечения порядка на уровне profile::puppetserver, но его эффективность зависит от каждого из его contain ed классовиспользуя тот же подход для любых классов, которые они сами объявляют, по крайней мере, когда эти классы третьего уровня должны быть ограничены порядком классов второго уровня.Это похоже на то, где вы падаете.

Обратите также внимание на то, что, хотя определенно существует необходимость упорядочить некоторые вещи относительно некоторых других, нет необходимости или очень полезно пытаться навязать явный общий порядок сверхвсе ресурсы.Работайте с максимально легкой рукой, устанавливая только те ограничения порядка, которые служат хорошей цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...