Puppet 在 inline_template 中解析 hiera

Puppet 在 inline_template 中解析 hiera

我有一些 .yaml hiera 文件,其中包含:

iptables::test:
  ip:
    1.1.1.1  : 'adm-1'
    2.2.2.2  : 'adm-2'
    3.3.3.3  : 'adm-3'

我想在 inline_template 中解析此文件。我写道:

$variable1 = hiera('iptables::test.ip')
$variable2 = inline_template("<% @variable1.each do |key,value| %>Allow From <%=key %> #<%=value %>\n<% end -%>")

但出现错误:

 Error 400 on SERVER: Could not find data item iptables::test.ip in any Hiera data file and no default supplied

答案1

您的数据结构或逻辑存在问题,或者两者都存在问题。我不确定我是否有足够的资料来找出问题所在。

我看到的第一个问题是您的hiera()查找函数无法直接查找嵌套ip哈希。您的 Hiera 键只是iptables::test。您可以通过查找获取其完整值,并在需要时进一步解析它。

$variable1 = hiera('iptables::test')

如果您不需要嵌套ip哈希,则您的inline_template()工作方式与所写相同。您的数据结构将只是一个哈希。

---
iptables::test:
  1.1.1.1: adm-1
  2.2.2.2: adm-2
  3.3.3.3: adm-3

如果您需要嵌套哈希,那么您需要一个嵌套循环。

$variable2 = inline_template("<% @variable1.keys.each do |ip| %><% @variable1[ip].each do |key, value| %>Allow From <%= key %> #<%= value %>\n<% end %><% end %>")

把它们放在一起来演示:

$ cat test.pp 
$variable1 = {
  ip  => {
    '1.1.1.1' => 'adm-1',
    '2.2.2.2' => 'adm-2',
    '3.3.3.3' => 'adm-3',
  },
}

$variable2 = inline_template("<% @variable1.keys.each do |ip| %><% @variable1[ip].each do |key, value| %>Allow From <%= key %> #<%= value %>\n<% end %><% end %>")

notice($variable2)
$ puppet apply test.pp
...
Notice: Scope(Class[main]): Allow From 1.1.1.1 #adm-1
Allow From 2.2.2.2 #adm-2
Allow From 3.3.3.3 #adm-3

Notice: Compiled catalog for localhost in environment production in 0.02 seconds
Notice: Applied catalog in 0.01 seconds

我在这里的测试没有使用 Hiera,因为 Hiera 只是一种从 Puppet 类外部获取数据的方法。我想演示这种方式,因为这样您可以更轻松地隔离问题。

相关内容