簡體   English   中英

迭代木偶中的yaml哈希

[英]iterating over yaml hash in puppet

我正在木偶中創建一個小的freeradius模塊。 我在創建client.conf文件時遇到一些問題,該文件看起來像這樣:

client switch01 {
    ipaddr = 10.10.10.50
    secret = secret
    shortname = switch01
}
client switch02 {
    ipaddr = 10.10.10.51
    secret = secret
    shortname = switch02
}

所以我試圖用模板文件clients.erb創建它。 這些是文件:

yaml文件:

test_freeradius::clients:
    'switch01':
        ip: '10.10.10.50'
        secret: 'secret'
        shortname: 'switch01' 
    'switch02::
        ip: '10.10.10.51'
        secret: 'secret'
        shortname: 'switch02'

限定:

define test_freeradius::clients (

  $ip,
  $secret,
  $shortname,

) {

  include test_freeradius::service

  if ! defined(File['/etc/freeradius/clients.conf']){
    file { '/etc/freeradius/clients.conf' :
      ensure  => 'file',
      owner   => 'root',
      group   => 'freerad',
      mode    => '0640',
      content => template('test_freeradius/clients.erb'),
      require => Class['test_freeradius::install'],
      notify  => Service['freeradius'],
    }
  }
  $data = hiera_hash('test_freeradius::clients')
}

init.pp:

class test_freeradius {

  create_resources(test_freeradius::clients, $data)
}

我可以像這樣創建一個客戶端:

client <%= @shortname %> {
    ipaddr = <%= @ip %>
    secret = <%= @secret %>
    shortname = <%= @shortname %>
}

但我無法創建多個客戶端! 最后我需要創建10個客戶端。

這不起作用:

<% test_freeradius::clients.each do |key,value| -%>
  client <%= key %> {
      ipadd = <%= value['ip'] %>
      asecret = <%= value['secret'] %>
      shortname = <%= value['shortname'] %>
  }
  <% end -%> 

我的問題是如何迭代哈希來創建client.conf文件?

非常感謝你!

一個有點相關的問題是你的$datainit.pp是未定義的,當與create_resources一起使用時會導致問題。 此外,您應該考慮在定義的資源類型中為該哈希創建一個參數,然后將其作為屬性參數傳遞。 然后,您可以在定義的資源類型中使用哈希。 此時,您嘗試傳遞未定義的哈希,然后在定義的資源類型中查找相同的哈希,這也是多余的。 我建議傳遞或查找它,而不是兩者兼而有之。

例如:

# clients.pp
define test_freeradius::clients(
  $client_settings = {}
)
...
}

# init.pp
...
test_freeradius::clients { 'create client confs':
  $client_settings => hiera_hash('test_freeradius::clients')
}

會優化和清理一些東西。 另請注意,如果在多個級別中找到該鍵,則hiera_hash將執行哈希合並,因此請注意這一點。

至於你在ERB中使用test_freeradius ,那里有幾個問題。 第一個是變量是data而不是test_freeradius::clients 接下來是Puppet使用ERB綁定到同一范圍內的Puppet變量,您可以將其用作@實例變量,因此在本例中為@data 結合這兩個修復,我們得出:

<% @data.each do |key, value| -%>
client <%= key %> {
    ipadd = <%= value['ip'] %>
    asecret = <%= value['secret'] %>
    shortname = <%= value['shortname'] %>
}
<% end -%>

請注意文檔中一個非常相關的示例: https//docs.puppet.com/puppet/4.10/lang_template_erb.html#iteration

並進一步建議檢查該文檔中的其他部分,以便在Puppet中的ERB中使用Puppet變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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