
我不知道如何表達這個問題,所以如果您認為不合適,請建議編輯。
我正在嘗試擴展現有的木偶模組以支援不同的作業系統。我遇到了一個小問題,我不確定如何以優雅的方式解決它。在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]
.
有什麼好的方法可以預防呢?到目前為止,我的想法是將其設為錯誤,並且$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
)。