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