Hash 在puppet中迭代yaml哈希

Hash 在puppet中迭代yaml哈希,hash,yaml,puppet,erb,hiera,Hash,Yaml,Puppet,Erb,Hiera,我正在木偶中创建一个小的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 } client &

我正在木偶中创建一个小的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
}
client <%= @shortname %> {
    ipaddr = <%= @ip %>
    secret = <%= @secret %>
    shortname = <%= @shortname %>
}
因此,我尝试使用模板文件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')
}
class test_freeradius {

  create_resources(test_freeradius::clients, $data)
}
定义:

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')
}
class test_freeradius {

  create_resources(test_freeradius::clients, $data)
}
init.pp:

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')
}
class test_freeradius {

  create_resources(test_freeradius::clients, $data)
}
我可以创建这样一个客户机:

client switch01 {
    ipaddr = 10.10.10.50
    secret = secret
    shortname = switch01
}
client switch02 {
    ipaddr = 10.10.10.51
    secret = secret
    shortname = switch02
}
client <%= @shortname %> {
    ipaddr = <%= @ip %>
    secret = <%= @secret %>
    shortname = <%= @shortname %>
}
客户端{
ipaddr=
秘密=
短名称=
}
但我无法创建多个客户端!最后,我需要创建10个客户端

这不起作用:

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

客户{
ipadd=
asecret=
短名称=
}
我的问题是如何迭代哈希以创建client.conf文件


多谢各位

一个有点相关的问题是
$data
init.pp
中未定义,这在与
创建资源一起使用时会导致问题。此外,您应该考虑只为定义的资源类型中的哈希创建参数,然后将其作为属性参数传递。然后可以在定义的资源类型中使用哈希。目前,您正试图传递一个未定义的哈希,然后在已定义的资源类型中查找相同的哈希,这也是冗余的。我建议要么通过它,要么查找它,不要两者都做

例如:

# 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\u freeradius::clients
。其次,Perb由Puppet使用,并绑定到Puppet变量,其作用域与您可用作
@
实例变量的作用域相同,因此在本例中,
@data
。结合这两个修复,我们得出:

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

客户{
ipadd=
asecret=
短名称=
}
请注意文档中的一个非常相关的示例:


并进一步建议查看该文档中的其他部分,以便在Puppet中使用ERB中的Puppet变量。

一个相关的问题是,
$data
init.pp
中未定义,这在与
创建\u资源
一起使用时会导致问题。此外,您应该考虑只为定义的资源类型中的哈希创建参数,然后将其作为属性参数传递。然后可以在定义的资源类型中使用哈希。目前,您正试图传递一个未定义的哈希,然后在已定义的资源类型中查找相同的哈希,这也是冗余的。我建议要么通过它,要么查找它,不要两者都做

例如:

# 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\u freeradius::clients
。其次,Perb由Puppet使用,并绑定到Puppet变量,其作用域与您可用作
@
实例变量的作用域相同,因此在本例中,
@data
。结合这两个修复,我们得出:

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

客户{
ipadd=
asecret=
短名称=
}
请注意文档中的一个非常相关的示例:


并进一步建议查看该文档中的其他部分,以便在Puppet中的ERB中使用Puppet变量。

感谢您的支持,它工作正常。我调整了我的
init.pp
:类test\u freeradius{$data=hiera\u hash('test\u freeradius::clients')创建资源(test\u freeradius::clients,$data)}我不完全理解你的意思:还有,您应该考虑只为定义的资源类型中的哈希创建参数,然后将其作为属性参数传递。然后可以在定义的资源类型中使用哈希。很抱歉我对木偶还是完全陌生的!我正在浏览你发布的链接。再一次非常感谢@麦克斯,很高兴你成功了。请点击旁边的复选标记接受我的答案。完成!你能告诉我正确的方向吗?如何在定义的资源中为哈希创建一个参数,并将其作为属性参数传递?然后在定义的资源类型中使用哈希?谢谢大家!@Max更新了答案,并给出了建议片段。我明白了!我想
hiera\u hash
会做hash覆盖而不是合并,就像变量绑定一样。我还需要仔细看看,因为我们公司有不同的radius服务器,它们有不同的交换机作为客户端!回答得很好,马特。谢谢谢谢你的支持,它工作得很好。我调整了我的
init.pp
:类test\u freeradius{$data=hiera\u hash('test\u freeradius::clients')创建资源(test\u freeradius::clients,$data)}我不完全理解你的意思:还有,您应该考虑只为定义的资源类型中的哈希创建参数,然后将其作为属性参数传递。然后可以在定义的资源类型中使用哈希。很抱歉我对木偶还是完全陌生的!我正在浏览你发布的链接。再一次非常感谢@麦克斯,很高兴你成功了。请点击旁边的复选标记接受我的答案。完成!你能告诉我正确的方向吗?如何在定义的资源中为哈希创建一个参数,并将其作为属性参数传递?然后在定义的资源类型中使用哈希?谢谢大家!@Max用建议片段更新了答案。我