Puppeteers Blog

Funktioiden kirjoittaminen Puppet-kielellä

May 24, 2018 

Puppetissa on suuri määrä erilaisia rakenteita, joilla turhaa toistoa koodissa voidaan vähentää. Aiemmin käsiteltiin jo resurssien oletusarvoja ja each-funktiota, joilla toistoa voidaan vähentää yksittäisessä manifest-tiedostossa. Funktiolla samalle koodilohkolle voidaan välittää parametreja, joiden perusteella se laskee mekaanisesti jonkin paluuarvon. Kuten Puppetin virallisten funktioiden listasta näkyy, tätä funktioiden ominaisuutta hyödynnetään mitä erilaisimpiin käyttötarkoituksiin. Funktioita voi paitsi käyttää eri manifesteissa, myös eri moduuleissa kuin missä ne on määritetty.

Perinteisesti funktioita kirjoitettiin Ruby-kielellä. Sittemmin on tullut mahdolliseksi kirjoittaa niitä myös Puppet-kielellä. Alla yksinkertainen esimerkki puppetfinland/openvpn-moduulista:

function openvpn::baseurl(Optional[String] $baseurl) >> String
 {
 if $baseurl {
 $baseurl
 } else {
 $proto = 'puppet'
 $share = 'files'
 "${proto}:///${share}"
 }
 }

Funktion määrittelyyn kuuluu funktion nimi ("openvpn::baseurl"), sen parametrit ($baseurl) datatyyppeineen ja paluuarvon tyyppi ("String"). Funktion paluuarvoksi tulee funktion kutsussa viimeisenä käsitelty lauseke. Yllä oleva funktio tarkistaa, onko $baseurl -parametrilla arvoa ja jos on, se palauttaa sen sellaisenaan ($baseurl), ja jos ei ole, se palauttaa oletusarvon "puppet:///files". Funktion kirjoittaminen oli tässä tapauksessa järkevää, koska samaa koodilohkoa kutsutaan useissa eri paikoissa saman moduulin sisällä.

Funktion paluuarvo voidaan sijoittaa muuttujaan tai käyttää sellaisenaan. Esimerkiksi yllä olevaa funktiota käytetään tähän tapaan:

$l_files_baseurl = openvpn::baseurl($files_baseurl)
 
 file { "openvpn-${ta}":
 name => $ta_path,
 source => "${l_files_baseurl}/openvpn-${ta}",
 mode => '0600',
 }

Puppet-kielellä kirjoitetut funktiot sijoitetaan moduulin juurihakemiston alla olevaan kansioon functions. Aivan kuten luokkienkin tapauksessa niiden nimen ja tiedostonimen pitää täsmätä. Yllä oleva funktio sijaitsee siis tiedostossa functions/baseurl.pp.

Vaikka Puppet-kielellä luodut funktiot ovatkin käytetävissä ne määrittelevän moduulin ulkopuolella, on niiden polussa aina moduulin nimi (yllä siis openvpn::baseurl). Mikäli halutaan luoda funktio päätasolle ilman moduulin nimeä, on se kirjoitettava Rubyllä.

Samuli Seppänen
Samuli Seppänen
Author archive
menucross-circle