迭代木偶中的yaml哈希

时间:2017-05-11 18:16:24

标签: hash yaml puppet erb hiera

我正在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文件?

非常感谢!

1 个答案:

答案 0 :(得分:0)

有些相关的问题是$data中的init.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将执行哈希合并,因此请注意这一点。

至于你在再培训局内使用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变量。