尽管明确使用了箭头运算符,但 Puppet 类仍然乱序

尽管明确使用了箭头运算符,但 Puppet 类仍然乱序

我是绝对的 Puppet 新手。我的 Puppet 清单出现了有趣的行为,我很想知道我做错了什么。例如,假设我正在使用以下有序类配置实例:

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 开关运行清单时,通过查看通知语句,我可以看到类按以下顺序执行:

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

我理解的正确吗?

答案1

您正在创建一个与类 ( postgresql) 及其中直接声明的资源的依赖关系。这不会创建与从其中包含的类 ( postgresql::install) 的依赖关系。因此,来自的资源postgresql::install根本不参与您正在创建的依赖结构。

您所需要的是让资源仅仅依赖于它们真正需要的东西,而不是试图强制执行高级命令 - 如果您需要在特定资源运行之前完成系统更新,那么只需从那里要求它即可。

答案2

当您像这样对课程进行排序时,您可能会认为明确的排序也适用于课程内部的资源,但事实并非如此......

Puppet 中有一个长期存在的错误,它要求您将类内的资源“锚定”到其父类中。 http://projects.puppetlabs.com/issues/8040

这个错误有一个解决方法,但是有点难以理解: http://projects.puppetlabs.com/projects/puppet/wiki/Anchor_Pattern

答案3

我用的是类似这样的东西-

 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 的有关模块包含的博客。

相关内容