模块中多个类的Puppet配置

时间:2015-03-02 12:45:23

标签: puppet

我想使用和配置puppet-nginx模块,尽管这是关于Puppet配置的一般性问题。

Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }

class nginx-setup {
    class { 'nginx': }
}

include nginx-setup

效果很好!现在,如果我按照文档进行配置,我最终会得到这样的结果:

Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }

class nginx-setup {
    class { 'nginx': }

    class { 'nginx::package':
        package_source => 'nginx-mainline'
    }
}

include nginx-setup

错误:重复声明:已声明类[Nginx :: Package]

我尝试include nginx而不是我的第一个类声明,但我认为模块的init.pp已经声明了nginx::package类,但仍然会出现重复声明错误。即使这样可行,如果我想在nginx模块中将更多配置应用于另一个类,该怎么办?例如:

Exec { path => [ "/bin/", "/sbin/" , "/usr/bin/", "/usr/sbin/" ] }

class nginx-setup {
    class { 'nginx': }

    class { 'nginx::package':
        package_source => 'nginx-mainline'
    }

    class { 'nginx::config': 
        nginx_error_log => 'syslog:server=localhost',
    }
}

include nginx-setup

许多重复的定义!

所以感觉我应该将所有必需的内容传递到我的初始类声明中,但我似乎无法找到正确的方法来完成它。实现这一目标的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

事实证明它是特定于模块的。 jfryman/puppet-nginx模块类自动加载except for nginx::config(除非它尚未声明),并且大多数其他类从nginx :: config继承其设置。该模块的正确解决方案是;

class nginx-setup {
    class { '::nginx::config':
        http_access_log => 'syslog:server=localhost,tag=nginx,severity=info',
        nginx_error_log => 'syslog:server=localhost,tag=nginx,severity=info',
    }

    class { '::nginx':
        package_source => 'nginx-mainline',
    }
}
include nginx-setup

jfryman/puppet-nginx正在向Hiera configurations迈进,这可能不会有效。在集成Hiera之前我想要一个纯粹的Puppet解决方案(学习),但我不会为所有人推荐它......

答案 1 :(得分:3)

TL; DR

毕竟考虑使用Hiera,因为Puppet处理类参数时存在一些缺点,因此这个模块使用起来很棘手。


答案很长:

这实际上是一个加载的问题,即使它不应该。你已经正确推断了这个要点。但是,让我们一步一步来。

模块结构

现在被认为是最佳实践(需要引用,尽管来自Puppet实验室的Ryan Coleman在最近的FOSDEM演示文稿中提到过这一点),以在其中心类(此处为类nginx)中公开模块的所有可调参数。

这样,用户很清楚他们需要为这一个类查找适当的参数,而不是寻找合适的类进行调整。

您选择的nginx模块似乎在很大程度上采用了这个模块,但不是因此。

使用defined()

进行黑客攻击

正如您所注意到的,模块作者添加了一些快捷方式,以便您可以安全地声明您的课程#34; if ,确保nginx::config课程在nginx课程之前遇到正确的词汇。

这很危险,因为在复杂的清单中,这可能不容易断言。

include vs. class {}

类参数存在问题,因为它们导致include比以前更不安全,因为它们与class { 'name': ... }样式声明不能很好地混合。后者总是坏消息,因为它们必须是独特的,正如您现在所经历的那样。

最好尽可能坚持include,这会导致下一个问题。

Hiera

使用参数化类,您确实希望尽快采用Hiera。将类参数定义为数据几乎普遍优于在清单中执行它。我理解首先要坚持简单结构的愿望,但由于上述问题,它真的会让自己的生活更加艰难。