我们正在使用角色/配置文件模式。在下面的示例中,我想选择性地从 hiera 传递一个参数,这样如果没有提供任何值,则使用 ::apache 类默认值(它从其 ::apache::params 类内部获取)。这将使我们能够在某些服务器上设置 keepalive 值,但允许 ::apache 类自行确定值(如果我们不这样做的话)。
common.yaml
-----------
profiles::apache::keepalive : On
profiles::apache::keepalive_timeout : 5
apache.pp
---------
class profiles::apache {
$apache_keepalive = hiera('profiles::apache::keepalive')
$apache_keepalive_timeout = hiera('profiles::apache::keepalive_timeout')
class {'::apache':
keepalive => $apache_keepalive,
keepalive_timeout => $apache_keepalive_timeout,
}
}
我尝试将 hiera 查找的默认值设置为“undef”,但最终配置中得到的是空值。
答案1
您可以通过以下方式实现此效果自动参数查找。
您的 Hiera 数据针对的是实际的apache 模块,而不是您的 apache 配置文件。
apache::keepalive: true
仅当class apache
有$keepalive
参数时才有效。
是的,这个默认值应该取自apache::params
。
class apache($keepalive = $::apache::params::keepalive)
inherits ::apache::params {
...
}
答案2
我个人更喜欢显式声明所有变量。在这种情况下,我会声明默认值common.yaml
,然后使用其他 yaml 文件声明与默认值不同的值,例如
common.yaml
-----------
profiles::apache::keepalive : On
profiles::apache::keepalive_timeout : 5
servertype.yaml
---------------
profiles::apache::keepalive : On
profiles::apache::keepalive_timeout : 30
然后将层次结构设置为hiera.yaml
:hierarchy: - servertype.yaml
- common.yaml
如果你不想这样做,那么我认为唯一的其他方法就是使用 if 语句
apache.pp
---------
class profiles::apache {
$apache_keepalive = hiera('profiles::apache::keepalive')
$apache_keepalive_timeout = hiera('profiles::apache::keepalive_timeout')
if ($apache_keepalive == undef) {
class {'::apache': }
}
else {
class {'::apache':
keepalive => $apache_keepalive,
keepalive_timeout => $apache_keepalive_timeout,
}
}
}