我們正在使用角色/設定檔模式。在下面的範例中,我想選擇從 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,
}
}
}