2017-05-11 2 views
1

Je crée un petit module freeradius en marionnette. J'ai des problèmes pour créer le fichier client.conf, ce qui devrait ressembler à ceci:itération sur un hachage de yaml en marionnette

client switch01 { 
    ipaddr = 10.10.10.50 
    secret = secret 
    shortname = switch01 
} 
client switch02 { 
    ipaddr = 10.10.10.51 
    secret = secret 
    shortname = switch02 
} 

Je suis en train de créer cela avec un fichier modèle de clients.erb. Ce sont les fichiers:

fichier YAML:

test_freeradius::clients: 
    'switch01': 
     ip: '10.10.10.50' 
     secret: 'secret' 
     shortname: 'switch01' 
    'switch02:: 
     ip: '10.10.10.51' 
     secret: 'secret' 
     shortname: 'switch02' 

définissent:

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

je pouvais crea te un client comme ceci:

client <%= @shortname %> { 
    ipaddr = <%= @ip %> 
    secret = <%= @secret %> 
    shortname = <%= @shortname %> 
} 

mais je ne pourrais pas réaliser créer plusieurs clients! à la fin, j'ai besoin de créer 10 clients.

Cela ne fonctionne pas:

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

Ma question est de savoir comment pourrais-je itérer sur le hachage pour créer le fichier client.conf?

Merci beaucoup!

Répondre

0

Un problème quelque peu lié est que votre $data n'est pas défini dans votre init.pp, ce qui pose problème lorsqu'il est utilisé avec create_resources. En outre, vous devez simplement créer un paramètre pour ce hachage dans votre type de ressource défini, puis le transmettre en tant que paramètre d'attribut. Vous pouvez ensuite utiliser le hachage dans votre type de ressource défini. Pour le moment, vous essayez de passer un hachage indéfini, puis de rechercher le même hachage dans le type de ressource défini, qui est également redondant. Je recommande soit de le passer ou de le regarder et de ne pas faire les deux.

Par exemple:

# clients.pp 
define test_freeradius::clients(
    $client_settings = {} 
) 
... 
} 

# init.pp 
... 
test_freeradius::clients { 'create client confs': 
    $client_settings => hiera_hash('test_freeradius::clients') 
} 

optimiserait et les choses propres un peu les. Notez également que votre hiera_hash effectuera une fusion de hachage si cette clé se trouve dans plusieurs niveaux, alors soyez conscient de cela. En ce qui concerne l'utilisation du test_freeradius dans l'ERB, vous avez quelques problèmes. Le premier est que la variable est data et non . Le suivant est que ERB est utilisé par Puppet avec des liaisons aux variables Puppet dans la même portée que vous pouvez utiliser comme variables d'instance avec @, donc dans ce cas @data. En combinant les deux corrections, nous arrivons à:

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

note un exemple très pertinent dans la documentation: https://docs.puppet.com/puppet/4.10/lang_template_erb.html#iteration

et recommandons en outre vérifier d'autres sections de ce document pour l'utilisation des variables de marionnettes ERB au sein de marionnettes.

+0

Merci pour le support, ça fonctionne très bien. J'ajusté mon 'init.pp': classe test_freeradius { $ data = hiera_hash ('test_freeradius :: clients) create_resources (test_freeradius :: clients, données $) } Je ne comprenais pas bien ce que Vous voulez dire: En outre, vous devriez envisager de créer un paramètre pour ce hachage en votre type de ressource défini, puis en passant ce paramètre comme attribut . Vous pouvez ensuite utiliser le hachage dans votre type de ressource défini. Désolé! Je suis encore totalement nouveau à la marionnette! Je vais par le lien que vous avez posté. encore une fois. Merci beaucoup! – Max

+0

@Max Glad qui a fonctionné pour vous. Veuillez accepter ma réponse puis en cliquant sur la coche à côté de celle-ci. –

+0

Terminé! pouvez-vous me conduire dans la bonne direction comment créer un paramètre pour le hachage dans la ressource définie et le passer comme un paramètre d'attribut? puis utilisez le hachage dans le type de ressource défini? Je vous remercie! – Max