Puppet:类型的条件定义

Puppet:类型的条件定义

我不确定如何措辞这个问题,所以如果您觉得不合适,请建议编辑。

我正在尝试扩展现有的 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_nameif $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.ppRedHat 系列和新系列,并从或install_otheros.pp中包含正确的类别)。init.ppparams.pp

相关内容