Augeas-resurssien luonnista ja debuggaamisesta

April 15, 2015 – Samuli Seppänen

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ä:

Want to talk to an expert?

If you want to reach us, just send us a message or book a free call!
menucross-circle