Puppeteers Blog

Puppet-moduulien laadunvarmistus, osa 1: automaattiset tarkistustyökalut

April 28, 2015 

Puppet-moduulien laatu pysyy korkeana, kun syntaksi- ja tyylivirheitä päästetä edes versionhallintaan asti. Puppet-koodin syntaksivirheet löytyvät helposti:

$ puppet parser validate <tiedosto>

ERB-templateiden virheet saa selvitettyä seuraavalla tavalla:

$ erb -P -x -T '-' <tiedosto>|ruby -c

JSON-tiedostojen (metadata.json) virheet etsiminen vaatii hieman kikkailua:

$ cat <tiedosto>|json_pp -f json -t null

Tyylivirheitä voi etsiä puppet-lint -työkalulla:

$ puppet-lint <tiedosto>
 $ puppet-lint .

Puppet-lint tunnistaa myös puppet-koodin, joka on eteenpäin tai taaksepäin epäyhteensopivaa. Onkin hyvin järkevää ajaa puppet-koodi aina puppet-lintin läpi ennen suuria Puppet-ympäristön päivityksiä.

Puppet-lint osaa paitsi havaita virheitä ja potentiaalisia ongelmia, myös korjata suuren osan niistä:

$ puppet-lint --fix .

Yllä oleva komento korjaa kaikki Puppet-manifestit työhakemistossa ja sen alla olevissa hakemistoissa. Vaikka useimmat puppet-lintin tekemät muutokset ovat turvallisia, voivat tietyt muutokset aiheuttaa toiminnallisia muutoksia koodissa ja noodien konfiguraatiossa. Ongelmien välttämiseksi on syytä lukea versionhallinnan (tässä Git) muutoslogit tarkasti ennen seuraavia Puppet-ajoja:

$ git diff
 --- snip ---
 diff --git a/manifests/loadsql.pp b/manifests/loadsql.pp
 index e4d028f..f0be81d 100644
 --- a/manifests/loadsql.pp
 +++ b/manifests/loadsql.pp
 @@ -28,26 +28,26 @@ define postgresql::loadsql
 )
 {
 file { "postgresql-${basename}.sql":
 - name => "${::postgresql::params::data_dir}/${basename}.sql",
 + ensure => present,
 + name => "${::postgresql::params::data_dir}/${basename}.sql",
 content => template("${modulename}/${basename}.sql.erb"),
 - ensure => present,
 - owner => postgres,
 - group => postgres,
 - mode => 600,
 + owner => postgres,
 + group => postgres,
 + mode => '0600',
 --- snip ---

Yllä olevat muutokset ovat kaikki täysin turvallisia, sillä toiminnallisesti mikään ei muutu. Sen sijaan alla oleva $pg_dump_extra_params -parametrin oletusarvon muutos voisi aiheuttaa ongelmia, etenkin jos kyseistä arvoa käytettäisiin ERB-templatessa:

 define postgresql::backup
 (
 - $ensure = 'present',
 $database,
 + $ensure = 'present',
 $output_dir = '/var/backups/local',
 - $pg_dump_extra_params = '',
 + $pg_dump_extra_params = undef,
 $hour = '01',
 $minute = '10',
 $weekday = '*',

Tässä Puppet-Finlandin postgresql-moduulin tapauksessa tyhjän merkkijonon ('') muuttuminen määrittämättömäksi arvoksi (undef) ei kuitenkaan aiheuta ongelmia.

Muutoslokien lukemisen lisäksi kannattaa ajaa puppet testimoodissa (puppet agent --test --noop), jotta mitään yllättäviä muutoksia ei tule myöskään käytännössä.

Kaikki yllä mainitut syntaksi- ja tyylitarkistukset löytyvät kätevästi paketoituna Puppet-Finlandin puppetmaster-moduulista. Luokka puppetmaster::validation asentaa kullekin tarkistukselle oman skriptinsä sekä erillisen skriptin, joka ajaa kaikki tarkistukset rekursiivisesti työhakemistossa. Lisäksi luokka lisää tarkistukset croniin, jolloin virheistä lähetetään sähköpostia, mikäli niitä moduulikansioon pääsee eksymään.

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