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.