Назад | Перейти на главную страницу

Классы марионетки вышли из строя, несмотря на явное использование оператора стрелки

Абсолютный новичок в марионетке. Я наблюдаю интересное поведение с моими марионеточными манифестами, и мне хотелось бы знать, что я делаю не так. Скажем, я настраиваю экземпляр со следующими упорядоченными классами:

class { 'update_system': } ->
class { 'facter': } ->
class { 'user_sshkey': user => 'ubuntu', type => 'rsa', } ->
class { 'tmux': user => 'ubuntu', } ->
class { 'vim': user => 'ubuntu', } ->
class { 'bashrc': user => 'ubuntu' } ->
notify {"Configuring DB role":} ->
class { 'postgresql': }

когда я запускаю манифест с переключателем --debug, глядя на инструкции notify, я вижу, что классы выполняются в следующем порядке:

1. update_system starts
2. a cron type inside of postgresql class (the very **last** class in that ordered list above) is executed
3. postgres::install starts
5. facter starts installing
6. postgres::configure and postgres::service start
7. the vim class is executed
8. "Configuring DB role" notification is made. All the way at the end here.
etc

По сути, это повсюду, порядок, похоже, никоим образом не следует за операторами стрелки.

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

Изменить: насколько я могу судить, часть проблемы заключается в том, что я использовал вложенные классы внутри модуля postgres в следующих строках:

class postgres {
   class{'postgres::install': } ->
   class{'postgres::config': } ~>
   class{'postgres::service': } ->
}

и насколько я понимаю, это не будет работать слишком хорошо без взлома привязки, согласно ошибка 8040

Я правильно понимаю?

Вы создаете зависимость с классом (postgresql) и ресурсы, прямо заявленные в нем. Это не создает зависимости от классов, которые включены оттуда (postgresql::install). Итак, ресурсы из postgresql::install не участвуют в создаваемой вами структуре зависимостей.

Вам нужно, чтобы ресурсы просто зависели от того, что им действительно нужно, вместо того, чтобы пытаться обеспечить выполнение высокоуровневого порядка - если вам нужно выполнить обновление системы до запуска определенного ресурса, просто потребуйте его оттуда.

Когда вы заказываете свои классы таким образом, вы можете подумать, что явный порядок будет применяться и к ресурсам внутри классов, но они не ...

В Puppet есть давно неурегулированная ошибка, требующая "привязки" ресурсов внутри классов к их родительскому классу. http://projects.puppetlabs.com/issues/8040

У этой ошибки есть обходной путь, но его сложно понять: http://projects.puppetlabs.com/projects/puppet/wiki/Anchor_Pattern

Я использую что-то вроде этого -

 node /^web*/ {

   include common_module
   include apache_base
   include webserver_install
   include webserver_delpoy


   Class ['common_module'] -> Class ['apache_base']  ->
   Class ['webserver_install'] -> Class ['webserver_delpoy']  

}

таким образом вы можете запускать модули в определенном порядке. также оформление заказа этот блог от puppet о сдерживании модулей.