Puppet on erittäin kätevä erityisesti hyvin monimutkaisten järjestelmien rakentamisessa ja ylläpidossa. Sen avulla on helppoa myös häivyttää suuriakin käyttöjärjestelmäeroja yhden luokkarajapinnan taakse. Hyvänä esimerkkinä käyvät Puppet-Finland-projektin thunderbird- ja openvpn-moduulit, jotka toimivat useilla eri Linux-jakeluilla ja Windowsilla.
Yleensä Puppettia varten rakennetaan palvelinympäristö, joka koostuu puppetserveristä, yleensä puppetdb:stä sekä mahdollisesti myös puppetboardista tai foremanista. Kullekin hallittavalle koneelle asennettu puppet-agent ottaa yhteyden puppetserveriin esim. kerran puolessa tunnissa, päivittää konfiguraationsa vastaamaan puppetserverillä määriteltyä tilaa ja lähettää raportin puppetserverin kautta puppetdb:lle.
Puppettia voidaan ajaa myös paikallisesti ilman puppetserveriä käyttämällä puppet apply-komentoa esimerkiksi seuraavasti:
$ puppet apply init.pp
Yksittäisellä manifest-tiedostolla (yllä init.pp) ei kuitenkaan pystytä tekemään ihmeitä. Puppet apply osaakin käyttää paikallisessa hakemistossa olevia puppet-moduuleita:
$ puppet apply --modulepath=/opt/puppet-modules init.pp
Yllä hakemisto /opt/puppet-modules sisältää kaikki ne moduulit, joita init.pp tarvitsee. Lisäksi siellä on oltava asennettuna moduulien vaatimat riippuvuudet. Moduulikansion ylläpito käsin on melko työlästä, mutta apuna voi käyttää esimerkiksi librarian-puppet-työkalua.
Puppet apply-pohjainen konfigurointi voidaan viedä astetta pidemmälle Kafolla. Kafolla puppet applyn päälle rakennetaan oikea asennusohjelma, jonka toimintaa voidaan ohjata komentoriviparametreilla. Kullekin Kafo-asennusohjelmalle on hyvä luoda rajapinnaksi räätälöity, yksinkertainen Puppet-moduuli muutamastakin eri syystä:
- Kafo-asentimen komentoriviparametrit luodaan rajapintamoduulin pääluokan dokumentaation (rdoc) pohjalta, jonka muodon suhteen Kafo on erittäin tarkka. Etenkin muiden ylläpitämien Puppet-moduulien dokumentaation muokkaaminen Kafon haluamaan muotoon ei ole välttämättä järkevää, koska muutoksia ei luultavasti saisi hyväksytyksi, vaikka niitä moduulien varsinaisille ylläpitäjille tarjoaisikin.
- Rajapintamoduulilla voidaan piilottaa asentimen kannalta epäoleelliset parametrit
- Rajapintamoduulilla voidaan yhdistää useiden eri moduulien toiminnallisuutta samaan tapaan kuin profiileilla "roles and profiles patternissa"
Kafo-asentimien luontiin vaadittava ympäristö on helppoa luoda Vagrant + Virtualbox -yhdistelmällä:
$ git clone https://github.com/Puppet-Finland/puppet-kafo
$ cd puppet-kafo
$ vagrant up kafo
Kun virtuaalikone on pystyssä, yhdistetään siihen seuraavasti:
$ vagrant ssh kafo
Sen jälkeen luodaan virtuaalikoneella hakemisto Kafo-asentimelle:
$ mkdir puppetmaster-installer
$ cd puppetmaster-installer
$ kafofy -n puppetmaster-installer
Asentimen hakemistoon on nyt luotu Kafon vaatima hakemistorakenne konfiguraatiotiedostoineen. Seuraavassa vaiheessa hakemistoon asennettaan asentimen vaatimat Puppet-moduulit. Tämän voisi tehdä käsinkin, mutta librarian-puppet -työkalulla homma hoituu kätevämmin:
$ rm -rf modules
$ librarian-puppet init
Tämän jälkeen määritetään asentimen tarvitseman moduulit ja niiden version Puppetfile-tiedostossa, jonka "librarian-puppet init" loi. Alla esimerkki hyvin yksinkertaisesta Puppetfilestä, jossa kaikki moduulit on määritetty noudettaviksi Git-repositoryistä:
#!/usr/bin/env ruby
#^syntax detection
# Puppet Forgen osoite
forge "https://forgeapi.puppetlabs.com"
# Kafo-installerin rajapintaluokka ("entrypoint")
mod 'puppetfinland-puppetmaster',
:git => 'https://github.com/Puppet-Finland/puppet-puppetmaster.git'
# Luokka, jolla asennetaan puppetserver
mod 'puppet-puppetserver',
:git => 'https://github.com/Puppet-Finland/puppet-puppetserver.git'
# Stdlib, jota hyvin monet muut luokat käyttävät. m
od 'puppetlabs-stdlib',
:git => 'https://github.com/puppetlabs/puppetlabs-stdlib.git',
:ref => '4.19.0
Puppetfileen voidaan määrittää myös moduuleja, jotka noudetaan Gitin sijaan Puppet Forgesta. Puppet Forgen käytön etuna on se, että librarian-puppet osaa moduulien vaatimat moduulit automaattisesti. Sen sijaan Gitiä käytettäessä moduulien vaatimukset on määritettävä itse Puppetfileen.
Rajapintamoduulin (yllä puppet-puppetmaster) pääluokka manifests/init.pp voi olla hyvinkin yksinkertainen:
# A simple wrapper class for setting up puppetmasters. Primarily
# aimed at use in Kafo installers.
#
# == Parameters:
#
# $puppetserver:: Setup puppetserver
# class puppetmaster
( Boolean $puppetserver = true
)
{ if $puppetserver {
class { 'puppetserver::repository': }
class { 'puppetserver': }
}
}
Huom! Kafo on erittäin tarkka parametrien dokumentaation muodosta. Esim. parametrien dokumentaatiossa ei sallita sarkaimia. Dokumentaatio pitää siis kirjoittaa juuri yllä esitetyssä muodossa.
Kun Puppetfile on luotu, voidaan siellä määritetyt moduulit asentaa moduulikansioon librarian-puppetilla:
$ librarian-puppet install
$ ls modules
apt
augeas
augeasproviders_core
puppetmaster
puppetserver
puppetserver_gem
stdlib
$ echo "puppetmaster: true" > config/installer-scenarios.d/default-answers.yaml
$ bin/puppetmaster-installer --list-scenarios Available scenarios default (INSTALLED)
$ bin/puppetmaster-installer --help Usage: puppetmaster-installer [OPTIONS] Options: = Generic: --[no-]colors Use color output on STDOUT (default: true) --color-of-background COLOR Your terminal background is :bright or :dark (default: :dark) --dont-save-answers Skip saving answers to './config/installer- scenarios.d/default-answers.yaml'? (default: false) --ignore-undocumented Ignore inconsistent parameter documentation (default: false) -i, --interactive Run in interactive mode --log-level LEVEL Log level for log file output (default: "info") -n, --noop Run puppet in noop mode? (default: false) -p, --profile Run puppet in profile mode? (default: false) -s, --skip-checks-i-know-better Skip all system checks (default: false) -v, --verbose Display log on STDOUT instead of progressbar -l, --verbose-log-level LEVEL Log level for verbose mode output (default: "info") -S, --scenario SCENARIO Use installation scenario --disable-scenario SCENARIO Disable installation scenario --enable-scenario SCENARIO Enable installation scenario --list-scenarios List available installation scenarios --force Force change of installation scenario --compare-scenarios Show changes between last used scenario and the scenario specified with -S or --scenario argument --migrations-only Apply migrations to a selected scenario and exit --[no-]parser-cache Force use or bypass of Puppet module parser cache -h, --help print help --full-help print complete help --[no-]enable-puppetmaster Enable 'puppetmaster' puppet module (default: true) = Module puppetmaster: --puppetmaster-puppetserver Setup puppetserver (current: true) Only commonly used options have been displayed. Use --full-help to view the complete list.