Puppeteers Blog

Puppet-koodin tiivistäminen each-funktiolla ja resurssien oletusarvoilla

March 14, 2018 

Puppet-koodissa on monia tapoja vähentää koodiin määrää. Silloin, kun pitää luoda useita hyvin samankaltaisia resursseja, on each-funktio erittäin kätevä työkalu. Jos luotavien resurssien erot rajoittuvat yhden parametrin arvoon, riittää seuraava:

# testfiles.pp
 $testfiles = ['/tmp/foo','/tmp/bar']
 $testfiles.each |$testfile| {
 file { $testfile:
 ensure => 'present',
 }
 }

Yllä oleva koodi luo molemmat tiedostot:

$ puppet apply testfiles.pp
 Notice: Compiled catalog for computer.example.org in environment production in 0.13 seconds
 Notice: /Stage[main]/Main/File[/tmp/foo]/ensure: created
 Notice: /Stage[main]/Main/File[/tmp/bar]/ensure: created
 Notice: Applied catalog in 0.03 seconds

Each-funktio on erityisen voimallinen, kun sen käyttämä data määritetään Hash-tyyppisessä muuttujassa. Alla esimerkki ini-tiedoston muokkauksesta gitdaemon-moduulissa:

$ini_settings = { 'GIT_DAEMON_ENABLE' => true,
 'GIT_DAEMON_BASE_PATH' => $base_path,
 'GIT_DAEMON_DIRECTORY' => $directory, }
 
 $ini_settings.each |$item| {
 ini_setting { $item[0]:
 ensure => 'present',
 path => '/etc/default/git-daemon',
 setting => $item[0],
 value => $item[1],
 }
 }

Toinen koodia säästävä lähestymistapa on käyttää resurssien oletusarvoja:

Ini_setting {
 ensure => 'present',
 path => '/etc/default/git-daemon',
 }
 
 ini_setting { 'GIT_DAEMON_ENABLE':
 setting => 'GIT_DAEMON_ENABLE',
 value => true,
 }
 
 ini_setting { 'GIT_DAEMON_BASE_PATH':
 setting => 'GIT_DAEMON_BASE_PATH',
 value => $base_path,
 }
 
 ini_setting { 'GIT_DAEMON_DIRECTORY':
 setting => 'GIT_DAEMON_DIRECTORY',
 value => $directory,
 }

Resurssien oletusarvojen kanssa pitää kuitenkin olla tarkkana, sillä niiden vaikutusalue voi laajentua puolivahingossa. Käytännössä vaikuttaa siltä, että niitä voi turvallisesti käyttää tiedostoissa, joista ei kutsuta muita luokkia tai määriteltyjä resursseja, joihin oletusarvot voisivat "valua". Puppetista löytyy myös turvallisempi tapa toteuttaa suunnilleen sama toiminnallisuus.

Yllä olevan kolmen ini-asetuksen määrittely suoraan olisi vaatinut 18 koodiriviä ja lopputulos olisi sisältänyt runsaasti toistoa. Resurssien oletusarvoilla päästiin 16 koodiriviin. Each-funktiota käyttäen päästiin 11 koodiriviin. Suuremmalla resurssien määrällä säästö olisi ollut vielä huomattavampi, koska jokainen uusi resurssi olisi lisännyt vain yhden rivin koodia.

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