NOTE: this article is now also available in English (here).

Aiemmassa blogikirjoituksessa käsittelin Augeaksen käyttöä Puppetin kanssa esimerkkinä PostgreSQL:n pg_hba.conf -tiedoston muokkaus. Tässä kirjoituksessa käsitellään XML-tiedostojen muokkausta Augeaksella, mikä on luultavasti siistein ratkaisu silloin, kun ei haluta hallita koko tiedostoa esimerkiksi ERB-templatena. Alla muokataan Pwm:n web.xml-tiedostoa, johon on määritettävä asetushakemiston polku.

Ennen itse Augeas-resurssin kirjoitusta kannattaa tarkistaa, mikä Augeaksen käsitys muokattavan tiedoston rakenteesta on. Ensin augtoolille pitää kertoa, mistä hallittava tiedosto löytyy:

$ augtool
 augtool> set /augeas/load/Xml/incl[1] /var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml
 augtool> load

Nyt Augeas näkee var-hakemiston polussa /files:

augtool> ls /files
 etc/ = (none)
 lib/ = (none)
 home/ = (none)
 boot/ = (none)
 augtool> load
 augtool> ls /files
 etc/ = (none)
 lib/ = (none)
 home/ = (none)
 boot/ = (none)
 var/ = (none)

Varmistetaan vielä, että muokattava tiedosto näkyy Augeakselle:

augtool> ls var/lib/tomcat8/webapps/pwm/WEB-INF/
 web.xml/ = (none)

Nyt katsotaan, miltä tiedosto Augeaksen mielestä näyttää. Tämä komento tuottaa valtavan määrän tulostetta, josta alla näytetään vain oleellinen:

augtool> print var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/
 --- snip ---
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/param-name
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/param-name/#text = "applicationPath"
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/#text[3] = " "
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/param-value
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/param-value/#text = "unspecified"
 /files/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml/web-app/context-param/#text[4] = " "
 --- snip --

Tämän pohjalta voidaan jo luoda varsinainen Augeas-resurssi:

 augeas { 'pwm applicationPath':
 incl => "/var/lib/tomcat8/webapps/pwm/WEB-INF/web.xml",
 lens => 'Xml.lns',
 changes => "set web-app/context-param/param-value/#text /etc/pwm",
 }

Resurssi kannattaa tallentaa esim. augtest.pp -tiedostoon ja alustavasti testata puppet apply-komennolla:

$ puppet apply augtest.pp

Tämän jälkeen koodin voikin jo integroida haluttuun Puppet-moduuliin (tässä tapauksessa puppet-pwm).

NOTE: this article is now also available in English (here) .

Puppetin Augeas-resurssilla voidaan muokata konfiguraatiotiedostojen osia sen sijaan, että hallittaisiin koko tiedostoa esim. templatella tai staattisella tiedostolla. Koko tiedoston hallinta tuottaa yleensä varmemmin ja vähemmällä vaivalla halutun lopputuloksen, mutta erityisesti luettelomaisten konfiguraatiotiedostojen tapauksessa Augeas-resurssi on erittäin käyttökelpoinen. Augeaksen käyttö ei-triviaaleissa tapauksissa on kuitenkin varsin haastavaa, ja usein onkin hyödyllistä rakentaa oikeat komennot käsin "augtool"-kehotteessa ja vasta sitten muuntaa ne Puppetin Augeas-resurssiksi.

Aluksi kannattaa tutkia, mikä Augeaksen näkemys jonkin konfiguraatiotiedoston rakenteesta on (ylimääräisiä rivejä on poistettu):

augtool> ls /files/etc/postgresql/9.4/main/pg_hba.conf
 --- snip ---
 #comment[65] = Database administrative login by Unix domain socket
 1/ = (none)
 2/ = (none)
 3/ = (none)
 4/ = (none)

Yllä muokattavat rivit (objektit) on numeroitu (1-4). Kunkin sisällön saa selville seuraavasti:

augtool> print /files/etc/postgresql/9.4/main/pg_hba.conf/1
 /files/etc/postgresql/9.4/main/pg_hba.conf/1
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/type = "local"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/database = "all"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/user = "postgres"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/method = "peer"

Augeaksella voidaan muokata näitä objekteja (1-4). Esimerkiksi jos objektin 1 kentän "method" arvoksi haluttaisiin asettaa "password", tehtäisiin näin:

augtool> set /files/etc/postgresql/9.4/main/pg_hba.conf/1/method password
 augtool> print /files/etc/postgresql/9.4/main/pg_hba.conf/1
 /files/etc/postgresql/9.4/main/pg_hba.conf/1
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/type = "local"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/database = "all"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/user = "postgres"
 /files/etc/postgresql/9.4/main/pg_hba.conf/1/method = "password"

Jos tiedostoon halutaan lisätä uusi rivi, pitää käyttää "ins"-komentoa, mikä onkin asteen verran hankalampaa. Ensin lisätään uusi rivi ensimmäisen tunnistautumisrivin jälkeen:

augtool> ins 0444 after /files/etc/postgresql/9.4/main/pg_hba.conf/1

Sen jälkeen määritetään tarvittavat kentät:

augtool> set /files/etc/postgresql/9.4/main/pg_hba.conf/0444/type local
 augtool> set /files/etc/postgresql/9.4/main/pg_hba.conf/0444/database tietokanta
 augtool> set /files/etc/postgresql/9.4/main/pg_hba.conf/0444/user matti
 augtool> set /files/etc/postgresql/9.4/main/pg_hba.conf/0444/method password

Tunnistautumisrivin numero (0444) on tarkoituksellisesti hyvin suuri, jotta tiedostoon muilla keinoin lisätyt rivit eivät saa vahingossa samaa tunnistetta. Alussa oleva nolla varmistaa lisäksi sen, että vaikka tunnistautumisrivejä luotaisiin muualta peräti 444 kappaletta, eivät rivien 0444 ja 444 indeksit mene silti päällekkäin. Tämä johtuu siitä, että Augeas ei ikinä lisää nollaa objektin tunnisteen alkuun - tai näin ainakin viisaammat ovat kertoneet. PostgreSQL:n tapauksessa rivimäärät ovat pieniä, joten päällekkäisyyksien riski on muutoinkin minimaalinen.

Tehdyt muutokset täytyy lopuksi tallentaa:

augtool> save

Kun konfiguraatiotiedoston muokkaus augtoolilla luonnistuu, voidaan rivit muuntaa Puppetin Augeas-resurssiksi:

augeas { 'sovellus-pg_hba.conf':
 context => "/files${::postgresql::params::pg_hba_conf}",
 changes => [
 "ins 0444 after 1",
 "set 0444/type local",
 "set 0444/database tietokanta",
 "set 0444/user matti",
 "set 0444/method password"
 ],
 lens => 'Pg_hba.lns',
 incl => "${::postgresql::params::pg_hba_conf}",
 # Varmista, ettei samaa riviä luoda uudelleen
 onlyif => "match *[user = 'matti'] size == 0",
 notify => Class['postgresql::service'],
 }

Parametri "context" lisätään Augeas-polun alkuun, eli yllä ennen 0444:sta. Näin säästytään toistamasta koko polkua "changes"-parametrissa, kuten augtoolia käytettäessä on tarpeen.

Linkkejä:

menucross-circle