Puppet


Puppet on Ruby-ohjelmointikielellä kirjoitettu avoimen lähdekoodin ohjelmisto, jolla hallitaan keskitetysti järjestelmien asetuksia ja automatisoidaan ylläpitoon liittyviä toimenpiteitä.


Se keskittyy Unix-pohjaisten järjestelmien hallintaan ja ylläpitämiseen, mutta sillä voidaan hallita myös perustasolla Windows-järjestelmiä.


Puppetin käyttö perustuu kuvaavaan ohjelmointikielen käyttöä, eli käyttäjä kuvailee haluamansa tuloksen ja Puppet toteuttaa tämän. Tämä tapa ei vaadi käyttäjältä erityistä ohjelmointitaitoa ja näin ollen Puppetin käytön opetteleminen on helppoa ilman sen kummempaa ohjelmoijan taustaa.


Puppet projektin kotisivut: http://puppetlabs.com/


Käsitteitä


Resurssi (resource)

Ylläpitotoimenpide. Esimerkiksi tiedoston luominen.


Luokka (class)

Luokka on Puppetissa resurssikokoelma, joka on tallennettu manifestiin.

Luokkien avulla koodi voidaan jakaa useaan eri manifestiin, joista niitä voidaan kutsua tarvittaessa, eikä kaikkia resursseja tarvitse laittaa yhteen manifestiin. Tämä helpottaa koodin selkeyttä ja käytettävyyttä huomattavasti.


Manifesti (manifest)

Manifestit ovat Puppetin ohjelmia, joiden tiedostopääte on '.pp'.

Manifestit koostuvat resursseista.

Manifestin voi ajaa paikallisesti seuraavalla komennolla:

$ puppet apply my_manifest.pp

Moduuli (module)

Moduulit ovat Puppetissa manifestien säilytystä varten olevia kansioita, joista Puppet osaa hakea sen sisältämät manifestit muistiinsa (modulepath). Tämä tarkoittaa sitä, että moduuleihin talletetun luokan pystyy ajamaan omasta sijainnista riippumatta Puppetin työkaluilla.


Moduulin (pelkistetty) rakenne:


.
└── my_module		= [Kansio] Modulin nimi
    └── manifests	= [Kansio] Sisältää kaikki modulin manifestit
        └── init.pp	= [Tiedosto] Sisältää modulin 'pää'-luokan, jolla on sama nimi kuin modulilla

Moduulin ajaminen:

$ puppet apply --modulepath moduulikansio/ -e 'include my_module'

'moduulikansio' on kansio, jonne olet luonut oman modulisi.

'my_module' on modulisi nimi.


Metaparametrit (metaparameter)

Resurssit voidaan järjestää metaparametreilla, joita Puppetissa ovat: 'before', 'require', 'notify' ja 'subscribe'.

Nämä metaparametrit määrittävät miten Puppetin pitäisi toimia ja niitä voidaan käyttää kaikkien Puppetin resurssien kanssa.


'before' määrittää resurssin ajettavaksi ennen siitä riippuvaa resurssia.

Esimerkiksi: before => File['riippuvainenresurssi']

Tämän 'before' parametrin omaava resurssi ajetaan ennen siitä riippuvaista 'riippuvainenresurssi' resurssia.


'require' määrittää resurssin ajettavaksi vasta kun siinä määritelty resurssi on ajettu ensin.

Esimerkik: require => File['vaaditturesurssi']

Tämän 'require' parametrin omaava resurssi ajetaan vasta kun resurssin ajoon vaadittu resurssi 'vaaditturesurssi' on ajettu.


'notify' ja 'subscribe' vastaavat 'before' ja 'require' metaparemetreja, mutta eroavat, siinä mielessä, että näillä parametreilla voidaan myös päivittää tiettyjen resurssityyppien toiminta kun niiden monitoroimassa resurssissa tapahtuu muutos.

Esimerkki: subscribe => File['monitoroitavaresurssi']

Tämän 'subscribe' parametrin omaava resurssi monitoroi 'monitoroitavaresurssi' resrussia ja on valmis päivittämään itsensä, jos 'monitoroitavaresurssi':ssa tapahtuu muutos. Yleensä monitoroidaan config-tiedostoja


Esimerkki 'before':n ja 'require':n käytöstä:

## Manifesti, joka luo kansion, siihen tiedoston ja linkin osoittamaan tiedostoon.

# Tämä resurssi ajetaan ensimmäisenä.
# Metaparametri 'before' määrittää tämän resrussin
# ajettavan ennen 'testfile':n luomista.

file {'/tmp/test1':
    ensure => directory,
    mode => 644,
    before => File['/tmp/test1/testfile'],
}

# Tämä resurssi ajetaan vasta toisena,
# sillä yllä olevan resurssissa tämä resurssi on
# määritelty riippuvaiseksi ylemmästä resurssissa.

file {'/tmp/test1/testfile':
    ensure => present,
    content => "Just another test..",
}

# Tämä resurssi ajetaan viimeisenä,
# sillä se vaatii 'testfile':n olemassaolon ennen ajamista.
file {'/tmp/test1/testlink':
    ensure => link,
    target => '/tmp/test1/testfile',
    require => File['/tmp/test1/testfile'],
}

Esimerkki 'subscriben':n käytöstä:

## Manifesti, joka varmistaa apachen olevan käynnissä ja tarvittaessa asentaa sen
## ja korvaa apachen oletus config tiedoston kustomoidulla conf-tiedostolla

class customApache {

	# asentaa apache2:n, jos ei jo asennettu.
        package {'apache2':
                ensure => installed,
        }

	# käynnistää apache2:n, jos ei käynnissä.
	# vaatii resurssin '/etc/apache2/apache2.conf' ajamista ensin
	# ja monitoroi sen muutoksia.
        service {'apache2':
                ensure => running,
                enable => true,
                subscribe => File['/etc/apache2/apache2.conf'],
        }

	# korvaa tiedoston '/etc/apache2/apache2.conf'
	# tiedostolla '/home/user/apache2_modded.conf'
        file { '/etc/apache2/apache2.conf':
                ensure => file,
                require => Package['apache2'],
                source => '/home/user/apache2_modded.conf',
        }

}

Ketjuttaminen (chaining)

Saman resurssien toteuttamisjärjestyksen saa aikaan ketjuttamalla.

Metaparametrien 'before' ja 'require' ketjuttamisen voi toteuttaa manifestissa '->' merkinnällä resurssien välissä. '->' merkintää voi käyttää myös toiseen suuntaan merkinnällä '<-' .

Metaparametrien 'notify' ja 'subscribe' ketjuttaminen toteutuu vastaavasti '~>' merkinnällä.


Resurssien toteuttamisjärjestyksen voisi siis toteuttaa ottamalla resursseista metaparametri-rivit pois ja lisäämällä manifestin loppuun määritykset sisältävän syntaksin.

Seuraavaa syntaksia voisi käyttää yllä olevaan esimerkkin lopussa:

Package['apache2'] -> File['/etc/apache2/apache2.conf'] ~> Service['apache2']


Lähteet:

http://docs.puppetlabs.com/learning/ral.html

http://docs.puppetlabs.com/learning/manifests.html

http://docs.puppetlabs.com/learning/ordering.html

http://docs.puppetlabs.com/learning/modules1.html