簡體   English   中英

Puppet - 在迭代哈希時,如果hiera中不存在,則設置清單中的默認值

[英]Puppet - set defaults in manifest if not present in hiera when iterating over hash

我正在迭代hiera散列中的許多條目,並希望通過設置清單中的默認值(例如ensuregroupsmanagehome等)從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迭代器參數中鍵值的默認值。 空哈希將在該迭代期間替換$valueundef (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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM