Pokud konfiguraci explicitně nezadáme, pokusí se démon použít konfiguraci z přednastaveného umístění, které je určeno při překladu programu. Nejprve se zkouší konfigurační databáze (většinou /var/lib/knot/confdb) a pokud neexistuje, zkouší se konfigurační soubor (většinou /etc/knot/knot.conf). Konfigurací může být prázdný soubor nebo prázdná databáze. Kromě démona knotd, využívá konfiguraci i nástroj knotc na ovládání démona, nástroj keymgr na správu DNSSEC a další.
Konfigurační soubor
Formát konfiguračního souboru vychází z formátu YAML, ale jedná se pouze o jeho zjednodušenou variantu s některými úpravami. Na nejvyšší úrovni jsou uvedeny konfigurační sekce, kde každá sekce obsahuje buďto přímo jednu sadu konfiguračních voleb (např. server) nebo sekvenci pojmenovaných sad stejných konfiguračních voleb (např. remote). Hlubší zanoření se nepoužívá a odsazuje se výhradně mezerami (nikoli tabulátorem). Stejnou sekci je možné uvést vícekrát. Nelze ale vícekrát uvést sadu se stejným identifikátorem. Identifikátor sady konfiguračních voleb musí být uveden vždy jako první. Příklady:
server: listen: 192.168.1.1 remote: - id: ok1 address: 192.168.1.2 # identifier not first- address: 192.168.1.3 id: bad_orderremote: - id: ok2 address: 192.168.1.3 # duplicate identifier- id: ok2 address: 192.168.1.3
Některé konfigurační volby mohou obsahovat více hodnot. O které volby se jedná, lze vyčíst z referenčního manuálu. Více hodnot je možné zapsat jako seznam v hranatých závorkách na jednom řádku nebo nestandardním způsobem s opakováním názvu volby na více řádcích. Příklady:
remote: - id: one-line address: [192.168.1.1, 192.168.1.2] - id: multi-line address: 192.168.2.1 address: 192.168.2.2
Při zopakování volby, která nepodporuje více hodnot, se použije pouze hodnota posledního výskytu.
Pokud hodnota obsahuje nějaký speciální znak (např. mezeru nebo komentář #), je třeba celou hodnotu uzavřít mezi dvojici dvojitých uvozovek " (jednoduchá uvozovka ' je považována za běžný znak). Příklad:
server: identity: "My best server #1"
Konfigurační soubor je načítán sekvenčně a při jeho zpracování se kontroluje validita hodnot, závislosti mezi některými položkami či nevhodné nastavení. Proto může záležet, v jakém pořadí jsou některé sekce uvedeny. Pokud je uvedená hodnota identifikátor nějaké konfigurační sekce, musí být takový identifikátor znám před jeho uvedením. Příklady:
remote: - id: remote1 address: 192.168.1.1 acl: - id: ok remote: remote1 action: transfer - id: ko # unknown identifier remote2remote: remote2action: transfer remote: - id: remote2 address: 192.168.1.2
Je dobrým zvykem ještě před načtením upraveného konfiguračního souboru ověřit, že neobsahuje chyby, které by zabránily jeho načtení. Obzvlášť při restartu démona by mohlo dojít k nepříjemné situaci. Pro ověření konfigurace slouží příkaz:
$ sudo knotc conf-check Configuration is valid
V případě chyby je stručně popsán problém a číslo řádku, kde se problém vyskytuje. U kontextových chyb číslo řádku odkazuje za postiženou sekci. Příklad:
$ sudo knotc conf-check error: config, file '/etc/knot/knot.conf', line 29, item 'remote', value 'remote2' (invalid reference) error: failed to load configuration file '/etc/knot/knot.conf' (not exists)
Zónové šablony
Při konfigurování více zón se stejným nastavením je praktické používat zónové šablony. Jedná se o pojmenované obecné nastavení zóny, na které se lze odkázat bez nutnosti opětovné specifikace všech voleb. Nastavení z šablony je možné potlačit explicitní specifikací příslušné volby. Šablona s identifikátorem default, pokud existuje, je použita pro nastavení všech zón, které nemají šablonu uvedenu. Příklady:
template: - id: default storage: /var/lib/knot/unsigned-zones dnssec-signing: off - id: signed storage: /var/lib/knot/signed-zones dnssec-signing: on zone: # zone with default template - domain: example.com. # zone with default template but signing enabled - domain: example.org. dnssec-signing: on # zone with signing enabled by template - domain: example.net. template: signed
Vkládání souborů
U obsáhlejších konfigurací nebo konfigurací, kde jsou různé části nastavení spravovány někým jiným, může být vhodné konfigurační soubor rozdělit na více částí a tyto části vložit do hlavního konfiguračního souboru. To lze provést konfigurační volbou include. Takže například soubor /etc/knot/zones.conf s dílčím obsahem konfigurace:
zone: - domain: example.com. - domain: example.net. - domain: example.org.
vložíme do hlavního souboru konfigurace /etc/knot/knot.conf:
server: listen: 192.168.1.1 template: - id: default storage: /var/lib/knot/zones include: /etc/knot/zones.conf
Konfigurační databáze
Konfigurační databáze je založena na výkonné databázi LMDB, která je typu klíč-hodnota. Její obsah není určen k přímému přístupu, ale přes ovládací nástroj knotc, čímž je do jisté míry zaručena její integrita. Hlavní výhodou konfigurační databáze je, že je okamžitě k dispozici oproti konfiguračnímu souboru, který se musí vždy nejprve naparsovat a uložit do dočasné konfigurační databáze (interně se pracuje pouze s nějakou formou konfigurační databáze). Pokud je tedy konfigurace obsáhlá, je vhodné použit perzistentní konfigurační databázi, neboť výrazně urychlí start démona knotd či spouštění nástrojů (knotc, keymgr).
Před použitím konfigurační databáze jí musíme nejprve inicializovat příkazem (pozor na vlastníka souborů databáze!):
$ sudo -u knot knotc conf-init OK
Tím se vytvoří prázdná konfigurační databáze /var/lib/knot/confdb a při dalším spuštění démona nebo některého z nástrojů se automaticky použije. Od této chvíle je případný konfigurační soubor ignorován!
Často ale nechceme vycházet z prázdné databáze, ale chceme ji naplnit obsahem nějakého existujícího konfiguračního souboru. To je možné provést příkazem:
$ sudo knotc conf-import /etc/knot/knot.conf OK
Po restartování démona sudo systemctl restart knot vidíme v logu informaci o použití konfigurační databáze:
Nov 15 14:09:39 ns1.xdp.cz knotd[171682]: info: loaded configuration database '/var/lib/knot/confdb', mapsize 512 MiB
Pokud bychom chtěli aktuální obsah konfigurační databáze exportovat do konfiguračního souboru, poslouží nám k tomu příkaz:
$ sudo knotc conf-export /tmp/knot.conf OK
Podobně jako u databáze žurnálu, i konfigurační databáze má limit na maximální zaplnění. Pokud by nám výchozí limit nevyhovoval (většinou 512 MiB), můžeme ho upravit přidáním řádků:
[Service] Environment="KNOT_CONF_MAX_SIZE=1024"
v editačním režimu po spuštění příkazu:
$ sudo systemctl edit knot
Po následném restartu serveru sudo systemctl restart knot vidíme v logu navýšený limit:
Nov 15 14:28:53 ns1.xdp.cz knotd[171851]: info: loaded configuration database '/var/lib/knot/confdb', mapsize 1024 MiB
Dynamická konfigurace
Ke konfigurační databázi přistupujeme pomocí nástroje knotc. Pro výpis aktuální konfigurace slouží příkaz conf-read s případným upřesňujícím parametrem názvu sekce či konkrétní volby. Příklady:
$ sudo knotc conf-read server server.rundir = /run/knot server.user = knot:knot server.listen = 2001:1488:ac15:ff30::28 127.0.0.1@53 ::1@53 $ sudo knotc conf-read zone[xdp.cz] zone.domain = xdp.cz. zone[xdp.cz.].notify = secondary zone[xdp.cz.].acl = acl_secondary zone[xdp.cz.].zonefile-sync = -1 zone[xdp.cz.].zonefile-load = difference-no-serial zone[xdp.cz.].journal-content = all zone[xdp.cz.].dnssec-signing = on zone[xdp.cz.].serial-policy = dateserial $ sudo knotc conf-read zone[xdp.cz].dnssec-signing zone[xdp.cz.].dnssec-signing = on
Abychom mohli konfiguraci upravovat, musíme nejprve zahájit konfigurační transakci příkazem conf-begin. V jednu chvíli může být aktivní pouze jedna transakce, která je sdílena mezi všemi klienty (knotc nebo rozhraní v Python). V rámci transakce jsou k dispozici příkazy:
- conf-get – obdoba conf-read ale zohledňuje změny v transakci,
- conf-set – nastavení nové hodnoty nebo přidání hodnoty do seznamu hodnot,
- conf-unset – odebrání volby nebo odebrání hodnoty ze seznamu hodnot,
- conf-diff – zobrazení rozdílu mezi aktuálním stavem a transakcí,
- conf-commit – ukončení transakce s uložením změn,
- conf-abort – ukončení transakce s ignorováním změn.
Pro ukázku si přidáme pokusný popis vzdáleného serveru s identifikátorem test:
$ sudo knotc conf-begin OK $ sudo knotc conf-set remote[test] OK $ sudo knotc conf-set remote[test].address 192.168.1.27 OK $ sudo knotc conf-set remote[test].address 2001:1488:ac15:ff30::27 OK $ sudo knotc conf-diff +remote.id = test +remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27 $ sudo knotc conf-get remote remote.id = secondary remote[secondary].address = 2001:1488:ac15:ff30::29 remote[secondary].key = key.xdp.cz. remote.id = test remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27 $ sudo knotc conf-read remote remote.id = secondary remote[secondary].address = 2001:1488:ac15:ff30::29 remote[secondary].key = key.xdp.cz. $ sudo knotc conf-commit OK $ sudo knotc conf-read remote remote.id = secondary remote[secondary].address = 2001:1488:ac15:ff30::29 remote[secondary].key = key.xdp.cz. remote.id = test remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27
Interaktivní režim
Ovládací nástroj knotc nabízí interaktivní režim, který může usnadnit práci nejen při správě konfigurace. Do tohoto režimu vstoupíme, když při spuštění knotc nezadáme žádný příkaz. Interaktivní režim je založen na službách knihovny libedit. Historie příkazů je uložena v souboru ~/.knotc_history. Názvy příkazů, sekcí nebo identifikátorů lze doplňovat klávesou TAB. Vyčištění terminálu pomocí CTRL+l. Poslední dnešní ukázkou je úprava konfigurace v interaktivním režimu v animované podobě (klikněte pro zvětšení):
Příště se podíváme na problematiku DNSSEC.
(Původně napsáno pro blog CZ.NIC.)