Puppeteers Blog

Useiden resurssien luonti lista-parametrien avulla

June 16, 2015 

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,
 }
Samuli Seppänen
Samuli Seppänen
Author archive
menucross-circle