[英]Puppet: manifest: optional parameter within class declaration
我有一個木偶清單要應用,但是,根據目標,定義的木偶模塊 class 不支持某些參數,但它會在其他目標上。
e.g. on targetA init.pp:
class myclass (
$foo = undef,
$bar = undef)
On targetB init.pp:
class myclass(
$foo = undef)
是否有一種方法可以在不修改已安裝在目標上的模塊的情況下可變地更改聲明中的參數?
即在targetA上,(運行puppet 5.x版):
file {‘extra.conf’:
ensure => present}
->
class {‘::myclass’:
foo => ‘myfoo’
}
在目標 B 上(運行 puppet 版本 4.x):
file {‘extra.conf’:
ensure => present|
->
class {‘::myclass’:
foo => ‘myfoo’,
bar => ‘mybar’
}
但是,如果在目標 A 上以這種方式聲明 class,則會由於額外的 'bar' 參數而發生錯誤。 有沒有辦法在使清單可移植的同時保留模塊(均名為“myclass”)?
有沒有辦法在使清單可移植的同時保留模塊(均名為“myclass”)?
是的。
將 class 參數放入 hiera 數據中,並include
類似 class 的聲明,而不是類似資源的 class 聲明,並依賴自動數據綁定。 您可以在每個節點上放置相同的數據,因為自動數據綁定僅查找類定義的參數的值——無論形式如何,它都會忽略不對應於 class 參數的鍵。
Puppet DSL 有一套相當豐富的條件語句,您可以使用這些條件語句來 select 一個適合實際目標節點的聲明。 這里真正的技巧是用什么條件來區分,因為沒有簡單的方法可以直接測試 class 是否支持特定參數。 您當然可以通過$hostname
或$certname
來區分,但如果有兩台以上的機器,那么您可能需要更通用的東西,例如$server_facts['serverversion']
。
例如,
case $server_facts['serverversion'] {
# Puppet version 4
/^4[.]/: { class { '::myclass': foo => 'myfoo' } }
# Anything else
default: { class { '::myclass': foo => 'myfoo', bar => 'mybar' } }
}
file { 'extra.conf':
ensure => 'present',
before => Class['::myclass'],
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.