Useiden resurssien luonti lista-parametrien avulla

June 16, 2015 – Samuli Seppänen

Toisinaan tulee tarve luoda useita samankaltaisia resursseja, joissa vain jonkin yksittäisen ominaisuuden arvo muuttuu. Esimerkiksi intranetin webbipalvelimeen voi joutua sallimaan yhteydet palomuurin läpi sekä sisäverkon että VPN:n osoiteavaruudesta. Vaikka Puppet ei suoraan tuekaan iteraatiota, sitä voi emuloida antamalla resurssin nimeksi ($title) listan merkkijonon sijaan.

Esimerkiksi Puppet-Finlandin webserver-moduulissa on parametrit $allow_address_ipv4 ja $allow_address_ipv6. Ne voivat saada arvokseen joko merkkijonon ('192.168.55.0/24') tai listan (['192.168.55.0/24', '10.69.0.0/16']):

class webserver::packetfilter
 (
 $allow_address_ipv4,
 $allow_address_ipv6
 
 ) inherits webserver::params

Kummankin parametrin arvo annetaan ::webserver::packetfilter::allow_ip -resurssin nimeksi ($title):

webserver::packetfilter::allow_ip { $allow_address_ipv4:
 provider => 'iptables'
 }
 webserver::packetfilter::allow_ip { $allow_address_ipv6:
 provider => 'ip6tables'
 }

Tämä aiheuttaa sen, että Puppet luo jokaista parametrina annetun listan alkiota kohden yhden annetun tyyppisen resurssin, jonka $title on listan alkion arvo. Webserver-moduulin tapauksessa kutakin alkiota kohden luodaan kaksi palomuurisääntöä:

define webserver::packetfilter::allow_ip
 (
 $provider = 'iptables'
 )
 {
 
 include ::webserver::params
 
 $allow_address = $title
 
 $source = $allow_address ? {
 'any' => undef,
 default => $allow_address,
 }
 
 firewall { "003 accept http from ${allow_address}":
 provider => $provider,
 chain => 'INPUT',
 proto => 'tcp',
 source => $source,
 dport => 80,
 action => 'accept',
 }
 
 firewall { "004 accept https from ${allow_address}":
 provider => $provider,
 chain => 'INPUT',
 proto => 'tcp',
 source => $source,
 dport => 443,
 action => 'accept',
 }
 }

Vastaavaa tekniikkaa voi käyttää myös useamman sisäkkäisen hakemiston luomiseen - alla esimerkki Puppet-Finlandin firefox-moduulista:

file { [ $mozilla_dir,
 $firefox_dir,
 $profiles_dir,
 $profile_dir ]:
 ensure => directory,
 owner => $username,
 }

Want to talk to an expert?

If you want to reach us, just send us a message or book a free call!
menucross-circle