配置 puppet 模块的最佳实践是什么?我有 puppet 2.7.11
。我觉得这种方式很混乱,看起来像使用全局变量。
node default {
$always_apt_update = true
include apt
}
我是否应该创建一个继承原始配置的类?文档似乎有太多版本,我不确定哪一个适合我。
更新:
当我尝试这个时:
class { 'apt':
always_update => 'true',
}
我收到一个错误:
Error 400 on SERVER: Invalid parameter always_update at /etc/puppet/manifests/nodes.pp:32
答案1
您应该使用参数化类而不是全局变量。
例如:
node default {
class {'apt':
always_update =>true
}
}
class apt ($always_update = true ) {
// code
}
node 'example.com' {
class { bar: }
}
有关更多信息,请参阅 Puppet 文档:
答案2
这些答案似乎有点过时,使用新版本的 puppet 即 3.7.x,可以使用 Hiera 传递类参数。像类声明这样的资源不再被视为最佳实践。
虽然第二个答案确实使用了 Hiera,但它明确使用了“hiera”函数,这又是一种不太可取的做法。
新的解决方案看起来是这样的:
/etc/puppet/manifests/site.pp
:
node default {
include apt
}
/etc/puppet/modules/apt/manifests/init.pp
:
class apt ($always_update = true ) {
// code
}
/etc/puppet/hieradata/<filename>.yaml
apt::always_update: true
Hiera 数据 yaml 文件可以根据需要具有不同的参数值。
答案3
目前推荐的做法是使用希拉。它内置于 3.x 中,但在 2.7 中您需要单独安装它。
然后,您可以从清单中的 Hiera 获取该apt
类别的数据:
$always_apt_update = hiera("always_apt_update")
使用像这样的 Hiera 配置..
:hierarchy:
- %{::clientcert}
- common
..节点(从事实中提取clientcert
)在查找中将比common.yaml
文件具有更高的优先级。
因此,使用always_apt_update: false
innode1.example.com.yaml
和always_apt_update: true
in 时common.yaml
,node1 最终会将该变量设置为 false,而其他节点则将其默认设置为 true。