我想使用和配置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
许多重复的定义!
所以感觉我应该将所有必需的内容传递到我的初始类声明中,但我似乎无法找到正确的方法来完成它。实现这一目标的最佳方法是什么?
答案 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)
毕竟考虑使用Hiera,因为Puppet处理类参数时存在一些缺点,因此这个模块使用起来很棘手。
答案很长:
这实际上是一个加载的问题,即使它不应该。你已经正确推断了这个要点。但是,让我们一步一步来。
现在被认为是最佳实践(需要引用,尽管来自Puppet实验室的Ryan Coleman在最近的FOSDEM演示文稿中提到过这一点),以在其中心类(此处为类nginx
)中公开模块的所有可调参数。
这样,用户很清楚他们需要为这一个类查找适当的参数,而不是寻找合适的类进行调整。
您选择的nginx
模块似乎在很大程度上采用了这个模块,但不是因此。
正如您所注意到的,模块作者添加了一些快捷方式,以便您可以安全地声明您的课程#34; if ,确保nginx::config
课程在nginx
课程之前遇到正确的词汇。
这很危险,因为在复杂的清单中,这可能不容易断言。
类参数存在问题,因为它们导致include
比以前更不安全,因为它们与class { 'name': ... }
样式声明不能很好地混合。后者总是坏消息,因为它们必须是独特的,正如您现在所经历的那样。
最好尽可能坚持include
,这会导致下一个问题。
使用参数化类,您确实希望尽快采用Hiera。将类参数定义为数据几乎普遍优于在清单中执行它。我理解首先要坚持简单结构的愿望,但由于上述问题,它真的会让自己的生活更加艰难。