2017-05-11 121 views
1

我在puppet中創建一個小freeradius模塊。我有一些問題創造client.conf文件,它應該是這個樣子:在傀儡中迭代yaml散列

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) 
} 

我可以CREA一個這樣的客戶端:

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文件?

非常感謝!

回答

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。接下來是ERB被Puppet使用,綁定到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

,並進一步建議檢查出該文件中其他部分使用中的木偶在ERB木偶變量。

+0

感謝您的支持,它工作正常。我調整我的'init.pp': 類test_freeradius { $數據= hiera_hash('test_freeradius ::客戶) create_resources(test_freeradius ::客戶,$數據) } 我不完全明白你的意思是: 另外,你應該考慮只爲 你定義的資源類型創建該散列的參數,然後將其作爲屬性 參數傳遞。然後,您可以在您定義的資源類型中使用散列。 對不起!我對傀儡還是全新的!我要通過你發佈的鏈接。 再次。非常感謝! – Max

+0

@Max很高興爲您效力。請接受我的答案,然後點擊旁邊的複選標記。 –

+0

完成!你可以讓我朝着正確的方向如何在定義的資源中爲散列創建一個參數並將其作爲屬性參數傳遞給它?然後在定義的資源類型中使用哈希?謝謝! – Max