Augeas - nástroj pro práci s konfiguračními nástroji

Z DCEwiki
Skočit na navigaci Skočit na vyhledávání

Augeas je konfigurační nástroj, který umí zpracovat nativní formát textových konfiguračních souborů do editovatelné stromové struktury a její modifikovaný obsah ukládat zpět tam kam patří.

augtool

Při lokální administraci přes příkazovou řádku lze používat utilitu augtool, která umožňuje interaktivní práci se stromovou strukturou augeasu přímo na příkazové řádce. Puppet ji ale nevyžaduje, protože ten komunikuje se stromovou strukturou augeasu přes jeho API.

Debian má tuto utilitu v samostatném instalačním balíčku augeas-tools.

Stromová struktura augeasu

V augeasu jsou všechny konfigurační soubory integrovány do jedné stromové struktury. V ní je uložen nejenom obsah textových konfiguračních souborů, ale také informace o těchto souborech a parserech, kterými byly zpracovány.

Poznámka V následujících příkladech byl augtool spuštěn s parametrem -A (alt. --noautoload), který zamezí automatickému natažení parsovacích filtrů.

Pozice

Pro určení pozice v rámci své stromové struktury používá Augeas XPath - nástroj, který se využívá také u XSL transformací XML dokumentů. Ten postupně vyhodnocuje jednotlivé kroky předané pozice, s tím že každý následující zpracovává výsledek toho předchozí.

Proces zpracování pozice začíná u kořene /, za kterým se musí buď *, která zastupuje název libovolného prvku na příslušné pozici, nebo jméno uzlu či prvku. Proces zpracování pozice pak může pokračovat dalším krokem.

Při určení pozice lze použít speciální kombinaci //, při které se Xpath neomezí při zpracování následujícího kroku pouze na prvky aktuální pozice, ale pokusí se jej aplikovat také na všechny potomky. To pochopitelně má vliv na rychlost zpracování celé pozice.

Součástí pozice mohou být také doplňující podmínky, jimiž lze blíže specifikovat nod který hledáme. Podmínka je uzavřena do hranatých závorek a lze jich nastavit i několik za sebou. V podmínkách lze používat také osy. Více viz praktické příklady.

Poznámka Při zadávání pozice lze s výhodou používat automatické doplňování s pomocí tabulátoru. Příkazový řádek augtool také uchovává vlastní historii.

ls

Příkaz ls vypíše potomky uzlů které jsou identifikovány předanou pozicí. Tím připomíná unixový příkaz ls, neboť absolutní určení pozice připomíná absolutní cestu ve stromové struktuře unixových souborových systémů.


Poznámka
root@stroj:~# augtool -A
augtool> ls /
augeas/ = (none)
files = (none)
/augeas
Součástí větve /augeas je veškerá infrastruktura augeasu spojená se zpracováním konfiguračních souborů.
/files
Do větve /files se integruje jako samostatná větev absolutní cesta k parsovanému konfiguračnímu souboru a obsah, který je výsledkem zpracování parsovacího filtru.

Větev

Hovořím-li o větvi, pak mám na mysli všechny prvky i s jejich atributy co se nachází od určité pozice dále.

print

Příkaz print vypisuje kompletní obsah větve vyhovující předané pozici. Je-li aplikován bez parametru, je výsledek stejný, jako by byla předaná výchozí pozice //, nebo /*.

Poznámka
augtool> print
/augeas
/augeas/root = "/"
/augeas/context = "/files"
/augeas/variables
/augeas/version = "0.10.0"
/augeas/version/save
/augeas/version/save/mode[1] = "backup"
/augeas/version/save/mode[2] = "newfile"
/augeas/version/save/mode[3] = "noop"
/augeas/version/save/mode[4] = "overwrite"
/augeas/version/defvar
/augeas/version/defvar/expr
/augeas/version/pathx
/augeas/version/pathx/functions
/augeas/version/pathx/functions/count
/augeas/version/pathx/functions/glob
/augeas/version/pathx/functions/label
/augeas/version/pathx/functions/last
/augeas/version/pathx/functions/position
/augeas/version/pathx/functions/regexp
/augeas/save = "overwrite"
/augeas/span = "disable"
/augeas/files
/augeas/load
/files

dump-xml

Kompletní větev lze vypsat také ve formátu XML, a to příkazem dump-xml , který podobně jako print vrátí tu část stromové struktury která vyhoví předané pozici. Je-li aplikován bez parametru, je výsledek stejný, jako by byla předaná výchozí pozice //, nebo /*.

Poznámka
<augeas match="/*">
  <node label="augeas" path="/augeas">
    <node label="root">
      <value>/</value>
    </node>
    <node label="context">
      <value>/files</value>
    </node>
    <node label="variables"/>
    <node label="version">
      <value>0.10.0</value>
      <node label="save">
        <node label="mode">
          <value>backup</value>
        </node>
        <node label="mode">
          <value>newfile</value>
        </node>
        <node label="mode">
          <value>noop</value>
        </node>
        <node label="mode">
          <value>overwrite</value>
        </node>
      </node>
      <node label="defvar">
        <node label="expr"/>
      </node>
      <node label="pathx">
        <node label="functions">
          <node label="count"/>
          <node label="glob"/>
          <node label="label"/>
          <node label="last"/>
          <node label="position"/>
          <node label="regexp"/>
        </node>
      </node>
    </node>
    <node label="save">
      <value>overwrite</value>
    </node>
    <node label="span">
      <value>disable</value>
    </node>
    <node label="files"/>
    <node label="load"/>
  </node>
  <node label="files" path="/files"/>
</augeas>

Parsery konfiguračních souborů - lens

Parsery konfiguračních souborů, se u augeasu nazývají lens. Jsou to skripty, které umí z textového konfiguračního souboru vytvořit novou větev stromové struktury augeasu, a tu pak integrovat jako součást větve /files.

Pozice položky konfiguračního souboru v rámci stromové struktury augeasu je pak daná kombinací cesty ke konfiguračnímu souboru v rámci souborového systému a interpretací obsahu parsovacím filtrem.

Parsovací filtry (lens) jsou textové soubory, s příponou .aug, které má Debian uložené v adresáři /usr/share/augeas/lenses/dist/. Většina z nich má v sobě také předdefinováno jaké konfigurační soubory se mají při načtení zpracovat - pokud se v systému vyskytují.

Většina lens se také načítá automaticky[1], je-li augtool spuštěn bez jakýchkoliv omezujících parametrů. Pro manuální načtení parsovacího filtru, nebo aby se aplikovaly změny v konfiguraci již natažených filtrů je třeba použít příkaz load.

Informace o zavedených filtrech

Informace o zavedených filtrech jsou součástí větve /augeas/load. Viz ukázkový výpis parsovacího filtru pro zpracování konfigurace zdrojů pro APT

Poznámka
augtool> ls /augeas/load/Aptsources/
lens = @Aptsources
incl[1] = /etc/apt/sources.list.d/*
incl[2] = /etc/apt/sources.list
excl[1] = /*.augnew
excl[2] = /*.augsave
excl[3] = /*.dpkg-dist
excl[4] = /*.dpkg-bak
excl[5] = /*.dpkg-new
excl[6] = /*.dpkg-old
excl[7] = /*.rpmsave
excl[8] = /*.rpmnew
excl[9] = /*~
lens

Název zavedeného filtru.

Poznámka Automaticky natažené filtry se od manuálně natažených liší tím, že mají před názvem v parametru lens znak @
incl

Z názvu, který je obsahem parametru lens je zřejmé, že jde o automaticky načtený filtr, který zpracovává obsahy souborů identifikovaných jako parametry incl, tj. soubory v adresáři /etc/apt/sources.list.d a obsah souboru /etc/apt/sources.list.

excl

Prostřednictvím nastavení parametrů excl je naopak určeno, které soubory má parser ignorovat.

Obsah konfiguračního souboru ve struktuře augeasu

Jak už bylo zmíněno, to jak vypadá obsah konfiguračního souboru ve stromové struktuře augeasu závisí na aplikovaném parsovacím filtru (lens) - v následujícím příkladu je demonstrován obsah konfiguračního souboru /etc/apt/sources.list

Poznámka
augtool> ls /files/etc/apt/sources.list/
1/ = (none)
augtool> print /files/etc/apt/sources.list/
/files/etc/apt/sources.list
/files/etc/apt/sources.list/1
/files/etc/apt/sources.list/1/type = "deb"
/files/etc/apt/sources.list/1/uri = "http://ftp.cz.debian.org/debian"
/files/etc/apt/sources.list/1/distribution = "wheezy"
/files/etc/apt/sources.list/1/component = "main

Parsovaný obsah tohoto konfiguračního souboru lze vypsat také v XML formátu, a to tak, že na příslušnou pozici /files/etc/apt/sources.list se místo příkazu print aplikuje příkaz dump-xml

Poznámka
<augeas match="/files/etc/apt/sources.list">
  <node label="sources.list" path="/files/etc/apt/sources.list">
    <node label="1">
      <node label="type">
        <value>deb</value>
      </node>
      <node label="uri">
        <value>http://ftp.cz.debian.org/debian</value>
      </node>
      <node label="distribution">
        <value>wheezy</value>
      </node>
      <node label="component">
        <value>main</value>
      </node>
    </node>
  </node>
</augeas>

Informace o zpracovaném konfiguračním souboru

Ve stromové struktuře augeasu není udržován pouze obsah parsovaného souboru, ale také informace o tom, jaký parser byl na soubor aplikován a kdy došlo k poslední úpravě parsovaného konfiguračního souboru (mtime). To vše je součástí větve /augeas/files.

Poznámka
augtool> print /augeas/files/etc/apt/sources.list
/augeas/files/etc/apt/sources.list
/augeas/files/etc/apt/sources.list/path = "/files/etc/apt/sources.list"
/augeas/files/etc/apt/sources.list/mtime = "1367244944"
/augeas/files/etc/apt/sources.list/lens = "@Aptsources"
/augeas/files/etc/apt/sources.list/lens/info = "/usr/share/augeas/lenses/dist/aptsources.aug:22.12-.42:"

Z ukázkového výpisu je vidět, že interpretace obsahu konfiguračního souboru /files/etc/apt/sources.list, je výsledkem automaticky načteného parsovacího filtru aptsources.aug.

Úpravy v prostředí augeasu

Pro změny a úpravy v prostředí augeasu se používají příkazy rm, clear, mv, ins, set a load

Zpracování konfiguračních souborů z jiných lokací

Ve výchozím nastavení zpracovává augeas pouze konfigurační soubory umístěné v adresáři /etc. Přidat do jeho stromové struktury také konfigurační soubory z jiné lokace však není problém.

  1. Nejdřív je třeba přidat cestu k tomuto konfiguračnímu souboru k nastavení odpovídajícího parsovacího filtru.
  2. A pak aplikovat příkaz load

Následující ukázkový příkaz demonstruje jak lze přidat do stromové struktury augeasu přidat ke zpracování testovací soubor se zdroji pro APT /root/sources.list.temporary

Poznámka
augtool> set /augeas/load/Aptsources/incl[last()+1] /root/sources.list.temporary
Upozornění Jak si lze povšimnout v ukázkovém příkladu, je místo číselného indexu položky incl použita funkce last(). Tím se zajistí, že se přidá další konfigurační soubor z jiné lokace jako nová položka. Pokud by bylo nastavení provedeno takto...
augtool> set /augeas/load/Aptsources/incl[2] /root/sources.list.temporary

...tak by nebyl konfigurační soubor z jiné lokace přidán jako nová položka, ale nahradil by cestu k souboru již jednou zpracovanému, což by mohlo vést při zavolání příkazu load k nežádoucímu výsledku.

Trochu menší zlo by bylo použít číselnou hodnotu indexu výrazně vyšší, než je počet aktuálně existujících položek - v takovém případě se totiž automaticky položka nastaví jako při použití funkce last()+1.

Manuální zavedení parsovacího filtru

Jak už bylo zmíněno, při automatickém načtení parsovacích filtrů se zpracují pouze ty konfigurační soubory v adresáři /etc, které vyhovují výchozímu nastavení automaticky zaváděných parsovacích filtrů.

Co však s konfiguračními soubory, které žádný automaticky zavedený parsovací filtr zpracovávat neumí?

Možnosti jsou v zásadě dvě:

  1. Aplikovat některý univerzální parsovací filtr
  2. Napsat si parsovací filtr vlastní

Jelikož psaní vlastních parsovacích filtrů není obsahem tohoto manuálu, budu se věnovat pouze prvnímu bodu.

Syntaxe konfiguračních souborů většinou vychází ze syntaxe použitého skriptovacího jazyka (PHP, Perl, Shell,..) případně se využívá XML, nebo JSON. Ke zpracování takových konfiguračních souborů se používají univerzální parsovací filtry, které je třeba zavést manuálně.

Následující příklad demonstruje zavedení univerzálního filtru Shellvars, kterým je zpracován soubor /tmp/test.conf s následujícím obsahem:

Poznámka
ITEM1='obsah první položky'
ITEM2='obsah druhé položky'
Poznámka Pro větší názornost je augtool v následujícím příkladu spuštěn s parametrem -A, který zamezí automatickému natažení parsovacích filtrů
Poznámka
augtool> print /augeas/load
/augeas/load
augtool> set /augeas/load/Shellvars/lens Shellvars.lns
augtool> set /augeas/load/Shellvars/incl /tmp/test.conf
augtool> print /augeas/load
/augeas/load
/augeas/load/Shellvars
/augeas/load/Shellvars/lens = "Shellvars.lns"
/augeas/load/Shellvars/incl = "/tmp/test.conf"
augtool> print /files
/files
augtool> load
augtool> print /files
/files
/files/tmp
/files/tmp/test.conf
/files/tmp/test.conf/ITEM1 = "'obsah prvn\303\255 polo\305\276ky'"
/files/tmp/test.conf/ITEM2 = "'obsah druh\303\251 polo\305\276ky'"
augtool>

Použití jiného parsovacího filtru

Ovšem pro zpracování tohoto testovacího "konfiguračního" souboru lze použít také jiný filtr Shellvars_list.

  1. Nejprve je třeba odstranit záznam ve větvi /augeas/files
  2. Poté odstranit buď celý filtr Shellvars, nebo z něj vyhodit alespoň položku incl
  3. Pak se nastaví nový filtr Shellvars_list
  4. A příkazem load se provede zpracování obsahu /tmp/temp.conf
Poznámka
augtool> rm /augeas/files/tmp
rm : /augeas/files/tmp 6
augtool> rm /augeas/load/Shellvars
rm : /augeas/load/Shellvars 3
augtool> set /augeas/load/Shellvars_list/lens Shellvars_list.lns
augtool> set /augeas/load/Shellvars_list/incl /tmp/test.conf
augtool> load
augtool> print /files
/files
/files/tmp
/files/tmp/test.conf
/files/tmp/test.conf/ITEM1
/files/tmp/test.conf/ITEM1/quote = "'"
/files/tmp/test.conf/ITEM1/value[1] = "obsah"
/files/tmp/test.conf/ITEM1/value[2] = "prvn\303\255"
/files/tmp/test.conf/ITEM1/value[3] = "polo\305\276ky"
/files/tmp/test.conf/ITEM2
/files/tmp/test.conf/ITEM2/quote = "'"
/files/tmp/test.conf/ITEM2/value[1] = "obsah"
/files/tmp/test.conf/ITEM2/value[2] = "druh\303\251"
/files/tmp/test.conf/ITEM2/value[3] = "polo\305\276ky"
augtool>

Použití augeasu prostřednictvím Puppetu

Využití defnode a defvar u augtool v porovnání se zjednodušením v rámci typu u Puppetu

Aplikace vybraného parseru u Puppetu

Podmíněné zpracování typu u Puppetu

Při podmíněném zpracování se využívá příkazů match a get


  1. Všechny, které mají ve skriptu nastaven autoload