Puppet

inline_template 中的 Puppet 解析層次結構

  • January 2, 2020

我有一些 .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

您的資料結構或邏輯或兩者都有問題。我不確定我是否有足夠的東西來解決這個問題。

我看到的第一個問題是您的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 類之外獲取數據的方法。我想以這種方式進行展示,因為這樣可以更容易地隔離您的問題。

引用自:https://serverfault.com/questions/996137