LPS:CFEngine3
Inicializace
Instalace
Na stroji není potřeba, aby cfengine přímo běžel, je ale důležitý pro testování:
apt-get install cfengine-community git
Defaultní konfigurace cfenginu není příliš použitelná, proto je třeba pro klienta udělat:
# warning: Deprecated bootstrap options detected. The --policy-server (-s) option is deprecated from CFEngine community version 3.5.0.Please provide the address argument to --bootstrap (-B) instead. cf-agent --bootstrap 147.228.52.124 /etc/init.d/cfengine-community start
Agent je nastavený tak, aby sám upravil /etc/defaults/cfengine a povolil startování agenta.
Nastavení GIT
Na serveru cf.civ.zcu.cz je z /etc/profile.d/git.sh nastaveno jméno a email dle krb5 lístku. Tyto volby je třeba provést, pokud je repozitář jinde (na jiném stroji nebo se přistupuje přímo ke git repozitáři na AFS). Pokud na stroji je rozběhnutý cfengine, pak tento skript spravuje cfengine sam, stejně jako syntax soubor pro editor vim.
Používá se GIT, proto je napřed nutné jej nakonfigurovat. Získat aktuální nastavení lze příkazem:
git config -l
Nastavení reálného jména a emailu pak takto
git config --global user.name "Tvoje Jmeno" git config --global user.email tvuj_login@civ.zcu.cz
Klon repozitáře
Používají se dvě sledovací větve k repozitáří:
- master - vytvoří se automaticky při klonování, slouží jako devel
- production - je třeba jí poprvé nastavit sledování, slouží pro provozní konfiguraci
Naklonování konfigurace, sám vytvoří adresář cfengine:
cd /root git clone file:///afs/zcu.cz/project/software/git/cfengine.git cf git clone ssh://civenka@eryx.zcu.cz/afs/zcu.cz/project/software/git/cfengine.git cf cd cf git checkout production git branch --set-upstream production origin/production
Přidání testování syntaxe před commitem (oproti originálu změněno kopírování z git checkout-index na normální cp -r *, protože git takto nezahrnul komitovanou změnu). Pokud se klon vytvoří v /root/cf dle výše uvedeného návodu, přidá skript sám cfengine pokud na stroji běží.
cat > .git/hooks/pre-commit << EOF #!/bin/bash # Author: Nick Anderson <nick@cmdln.org> # git pre-commit hook to check CFEngine policy for syntax errors # List of files to check with cf-promises, this is relative to # masterfiles promises.cf and failsafe.cf are the standard entry # points. You might want to add any other entry points you use. checkfiles="promises.cf update.cf" cfpromises="/var/cfengine/bin/cf-promises" # I try to guess which cf-promises you want to use by looking in the # common locations, but you can manually specify path to cf-promises # cfpromises="/var/cfengine/bin/cf-promises" if [ -z "$cfpromises" ]; then echo "Unable to find cf-promises, please specify the path manually" 1>&2 echo "in $0 or install into one of the common locations ($commoncfbin)" 1>&2 exit 1 fi ERRORS=0 # Directory to create temporary checkout tmp="/tmp" #tmpdir=$(mktemp --directory --dry-run --tmpdir=$tmp) tmpdir=$(mktemp --directory --tmpdir=$tmp) if [ $? -eq 1 ]; then ((ERRORS++)) echo Creation of temporary directory in $tmp FAILED exit $ERRORS fi # Checkout a copy of the current index into a temporary directory for testing #git checkout-index --prefix=$tmpdir/ -af cp -r * $tmpdir/ if [ $? -eq 1 ]; then ((ERRORS++)) echo Checkout to $tmpdir FAILED exit $ERRORS rm -rf $tmpdir fi for file in $checkfiles; do $cfpromises -cf $tmpdir/$file if [ $? -eq 1 ]; then ((ERRORS++)) echo Syntax check on $file FAILED fi done # Cleanup temporary checkout rm -rf $tmpdir if [ $ERRORS -gt 0 ]; then echo Aborting, we dont allow broken commits exit $ERRORS fi EOF
Jak to celé funguje
Hlavní repozitář je v /afs/zcu.cz/project/software/git/cfengine.git/, odtud si cfengine-server (součást politiky update.cf) kontroluje každých 5min změnu. Změny pak pro jednotlivé větve
- master (development/vývoj - určeno pro vývoj na strojích, které mohou několik dní neběžet)
- testing (testování - neprovozní stroje, ale používané více správci, takže není dobré si je rozhněvat)
- production (produkce - provozní stroje, velké změny po důkladném otestování, není jednoduchá cesta zpět, protože rollback v gitu nemusí znamenat vrácení konfigurace do žádoucího stavu)
stahuje do /var/cfengine/masterfiles_branches/, zde si jej vyzvedává cf-agent na klientech (za klienta se považuje i samotný server) dle konfigurace v update.cf. Agent si kopii udržuje v /var/cfengine/inputs/ odkud ji testuje a provádí.
Agent se "sám" na základě třídy rozhodne, kterou větev (master, testing, production) bude kopírovat. Idea převzata z knihy.
Aktualizace konfigurace CFEnginem
CFEngine používá pro aktualizaci politik update.cf, ten si volá před samotným spuštěním promises.cf. Jedná se o dva nezávislé kódy a NIKDY by se nemělo zasahovat do obou současně, aby byla vždy možnost to nějak opravit, buď přes aktualizaci nebo nějakým zásahem z politiky. Po změně souboru update.cf je třeba řádně otestovat na různých verzích cfengine, tak aby opravdu fungoval všude.
Zobrazení dostupných tříd
Ve starších verzích před 3.6 není parametr --show-classes, který to umí. Je tak třeba spustit cf-agent -nv | grep classes: (ve verbose mode), to ale není přiliš přehledné, proto byla dopsána volba:
cf-agent -Kf ./promises.cf -D show_classes
Která vytiskne seznam abecedně uspořádaných tříd, které jsou globálně dostupné včetně těch jež byly dodefinovány přes inventory, knihovny apod.:
2014-04-08T10:35:25+0200 notice: R: 127_0_0_1 2014-04-08T10:35:25+0200 notice: R: 147_228_52_35 2014-04-08T10:35:25+0200 notice: R: 2_cpus 2014-04-08T10:35:25+0200 notice: R: 32_bit 2014-04-08T10:35:25+0200 notice: R: April 2014-04-08T10:35:25+0200 notice: R: Day8 2014-04-08T10:35:25+0200 notice: R: GMT_Hr8 ...
V případě zadání tohoto parametru se neprovádí žádná služba.
Ruční spuštění jednotlivých služeb
Pokud se použije definice třídy service_<name>, kde name je jméno definované služby (mělo by odpovídat názvu podadresáře v services/), pak nebude provedeno defaultní chování, ale zavolá se jen konkrétní požadovaná služba. Např.:
# cf-agent -Kf ./promises.cf -D service_kerberos notice: R: main: Spoustena sluzba kerberos, protoze ji pozadujes.
Když bude zadáno špatné jméno (minimálně však service_ včetně podtržítka), pak se nic neprovede, jen dostanete seznam definovaných služeb:
# cf-agent -Kf ./promises.cf -D service_hotentot 2014-04-07T16:26:03+0200 notice: R: main: Pozadujes 'service_hotentot', ale ta neexistuje, vyber si z nize nabidnutych: 2014-04-07T16:26:03+0200 notice: R: main: -> service_fibrechannel 2014-04-07T16:26:03+0200 notice: R: main: -> service_ntp 2014-04-07T16:26:03+0200 notice: R: main: -> service_j2ee 2014-04-07T16:26:03+0200 notice: R: main: -> service_nagios ...
Jak je vidět, celé se to chytá na prefix service_, pokud se v něm uklepnete, nastane defaultní chování - provede se vše, co se má.
Služeb lze zadávat i více, pro oddělení se používá čárka:
cf-agent -Kf ./promises.cf -D service_ntp,service_kerberos
Pozor, při ručním zadání můžete spustit takovou službu, která se na daném stroji nemá spouštět, obchází se tím rozhodovací podmínky z bundle services (soubor hosts.cf). Takže je například možno pustit službu debian i na solarisu, což může mít neblahé (nebo naopak požadované) důsledky.
Jazyk CFEngine
Jde o konfigurační jazyk vyšší úrovně a spíše lze mluvit o předpisech (slibech), oproti klasickým programovacím jazykům jsou zde tyto rozdíly:
- vše se řídí na základě tříd (vlastností) a to včetně podmíněných konstrukcí
- předpisy se provádějí paralelně, pokud je potřeba něco udělat dříve, je nutné nastavit závislost mezi nimi
- struktura funkcí připomíná objektové programování, ale to je tak jediná shoda
Na první pohled je to strašný bordel, ale po prostudování to dává smysl. Je to velmi mocný jazyk a hodně složitých věcí lze udělat jednoduše, bohužel některé jednoduché vyžadují trochu více psaní, než by bylo žádoucí.
Další podstránky
- Architektura - aneb jak to máme zadrátované
- Implementace - aneb co takovy CFEngine vlastně dělá
- Řešení - aneb jak řešit některé problémy
- TODO
- hands-on podklady
Odkazy
- Návody pro git - Jak řešit složitější věci v GITu
- A Case Study in CFEngine Layout - Dynamicke bundle sequence a jine triky
- Automating infrastructure management with Cfengine - Uvod do CF3 a pekne shrnuti vcetne zakladnich pojmu
- Guide to CFEngine 3 Body of Knowledge - hromada příkladů a odkazů k CF3