在 puppet 中遍历 yaml hash
iterating over yaml hash in puppet
我正在 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 文件?
非常感谢!
一个有点相关的问题是您的 $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
将进行哈希合并,因此请注意这一点。
至于你在 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 变量。
我正在 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 文件?
非常感谢!
一个有点相关的问题是您的 $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
将进行哈希合并,因此请注意这一点。
至于你在 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 变量。