我不确定如何措辞这个问题,所以如果您觉得不合适,请建议编辑。
我正在尝试扩展现有的 puppet 模块以支持不同的操作系统。我遇到了一个小问题,我不知道如何以优雅的方式解决它。params.pp
文件中有这样的要安装的操作系统特定软件包的定义:
case $::osfamily {
'RedHat': {
$package_server = 'mariadb-server'
$package_client = 'mariadb'
$php_package_name = 'php-mysql'
}
...
该模块的编写方式使得整个配置取决于是否已$php_package_name
安装。我想将此模块扩展到不同的操作系统,这些操作系统没有单独的 php mysql 包,因此我将$php_package_name
变量设置为undef
。这带来了一个问题,即 puppet 尝试安装Package[undef]
。
有什么好方法可以防止这种情况发生?到目前为止,我的想法是将其设置为 false,并且只定义$php_package_name
火if $php_package_name != false
。也许有更好的方法?
答案1
是的,这似乎是一种合理的方法。我建议对此稍作修改,添加一个新参数来确定是否应该应用package
所使用的资源:$php_package_name
case $::osfamily {
'RedHat': {
$package_server = 'mariadb-server'
$package_client = 'mariadb'
$php_package_name = 'php-mysql'
$php_package_install = true
}
'otherOS': {
$package_server = 'mariadb-server'
$package_client = 'mariadb'
$php_package_install = false
}
...
那么资源在哪里:
if $thismodule::params::php_package_install {
package { $thismodule::params::php_package_name:
ensure => present,
...
}
}
请记住,如果在新操作系统上安装所需的资源大不相同,那么在 params.pp 中执行所有操作系统特定操作的方法可能不会更简洁;这可能会让您的清单文件变成一堆无法阅读的条件和参数。在这种情况下,不要害怕将不同的操作系统拆分成一个单独的类(例如install_el.pp
RedHat 系列和新系列,并从或install_otheros.pp
中包含正确的类别)。init.pp
params.pp