[英]Puppet - set defaults in manifest if not present in hiera when iterating over hash
我正在迭代hiera散列中的許多條目,並希望通過設置清單中的默認值(例如ensure
, groups
, managehome
等)從hiera中刪除相同的重復行,並且如果存在重復的鍵/值對,則覆蓋默認值在hiera。
到目前為止,我嘗試過的所有內容都無法獲得默認值。 我認為我需要聲明一個資源,但我不確定。
我已嘗試在查找和其他方法中設置“default_values_hash”,但似乎沒有任何內容將默認值傳遞給迭代和--debug輸出
這是我的清單和層次數據的(偽)示例。 任何指導都真誠地感謝。 謝謝。
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |$key, $value| {
user { $key :
ensure => $value['ensure'],
name => $value['name'],
password => $value['password'],
groups => $value['groups'],
managehome => $value['managehome'],
}
}
}
include class test
在Hiera:
test::hash:
'fred':
name: fred
password: somepassword
groups: wheel
managehome: true
'mary':
name: mary
password: otherpassword
'john':
name: john
password: anotherpassword
'harry':
在清單中設置資源默認值(使用大寫的User
)不會傳遞到迭代中,但如果我將所有數據保留在清單中(太多數據要做)。
lookup
函數使您能夠為散列本身建立默認值,但不能真正為散列內的鍵和值建立。 此外,使用lookup
函數作為Puppet中的類參數值將被自動參數綁定取代。 換句話說,你在這個上下文中的lookup
函數什么都不做,因為Puppet更喜歡對它進行自動參數綁定,而你正在使用它們(對於Hiera 5的lookup
,這肯定是正確的,你看起來正在使用它)。 我個人覺得這種行為很煩人,但事實就是如此。 編輯:沒關系那個具體的推理; 該參數稱為$testhash
而不是$hash
。 如果該參數來自模塊數據,那么lookup
仍將被忽略,因為Puppet僅允許模塊數據的自動參數綁定。
我很驚訝資源默認設置不適合你。 我不得不相信這是無意的,或者當你走這條路線時,某些事情被誤解了。
無論如何,這是一個有保障的方法。 首先,我們實現每個表達式的默認屬性: https : //puppet.com/docs/puppet/5.3/lang_resources_advanced.html#per-expression-default-attributes
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
ensure => $value['ensure'],
name => $value['name'],
password => $value['password'],
groups => $value['groups'],
managehome => $value['managehome'],
;
}
}
}
但是仍然存在一個問題,即您要為所有迭代在第二個塊中建立屬性值。 如果這些鍵值對未定義,Puppet將錯誤而不是默認為另一個值。 如果您首先為它們定義了值,我們需要指示Puppet僅為屬性建立值。 值得慶幸的是,我們可以使用*
屬性執行此操作: https : //puppet.com/docs/puppet/5.3/lang_resources_advanced.html#setting-attributes-from-a-hash
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
* => $value,
;
}
}
}
這里的一個建議是使你的lambda迭代器變量$key, $value
更透明地命名。 另一個注意事項是,要使*
屬性起作用,您的哈希鍵必須與Puppet屬性名稱匹配。
更新的問題:在散列具有nil
值的鍵的情況下,您可以將空散列設置為lambda迭代器參數中鍵值的默認值。 空哈希將在該迭代期間替換$value
的undef
(Puppet nil
)。 這將確保*
運算符中不包含任何屬性和值,並且所有默認值都將占優勢。
class test (
Hash $testhash = lookup('test::hash', "merge" => 'hash'}),
){
$testhash.each |String $key, Hash $value = {}| {
user {
default:
ensure => present,
name => 'username',
password => 'userpassword',
groups => ['usergroups'],
managehome => false,
;
$key:
* => $value,
;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.