LPS:CFEngine3/hands-on
Instalace
echo "deb http://cfengine.com/pub/apt stable main" >> /etc/apt/sources.list echo "deb http://download.zcu.cz/public/software/linux/debian stable main" >> /etc/apt/sources.list
apt-get update apt-get install cfengine-community vim-syntax-cfengine3
Struktura .cf
Co lze v souboru potkat:
- bundle: sbirka promises (slibu)
- typ bundle: podle toho co chci delat, lisi se povolenymi atributy a cilem (definice promennych, trid, sprava souboru, sprava baliku, reporty, ...)
- body: sbirka atributu (mozno parametrizovat)
- funkce: nekdy vraci hodnotu, jindy tridu, nekdy delaji neco jineho, pouzivaji se v atributech slibu
Common:
- body common control: odrazovy mustek pro programy
- bundle common *: globalni (pro vsechny programy), promenne a tridy v nem nastavene jsou globalni, v jinych bundlech pouze lokalni, ale lze se na ne odkazat pres nazev bundle
bundlesequence vs. usebundle:
- bundlesequence je pevne dane v 'body common control', nelze uz menit, je to dobry start pro inicializaci
- usebundle je dynamicky a lze predavat parametry, navratove hodnoty lze, ale je to problematicke, je mozne na zaklade trid prorezavat a tim zrychlit beh
Ukázkové bundly
Spousta příkladů:
/var/cfengine/share/doc/examples/
Hello world: test1.cf
body common control { bundlesequence => {"main"}; } bundle agent main { reports: verbose:: "Hello World"; }
cf-agent -Kf ./test1.cf cf-agent -Kf ./test1.cf -D verbose 2014-03-18T17:11:18+0100 notice: R: Hello World
Soubor: test2.cf
body common control { bundlesequence => { "main" }; } bundle agent main { vars: any:: "file" string => "/tmp/cftest.txt"; classes: any:: "file_exists" expression => fileexists("$(file)"); files: any:: "/tmp/cftest.txt" create => "true", classes => if_repaired("file_created"); reports: file_exists:: "Soubor existuje"; file_created:: "Soubor byl vytvoren"; }
cf-promises -cf ./test2.cf ./test2.cf:20:0: error: Undefined body if_repaired with type classes
Ukradneme z /var/cfengine/share/CoreBase/lib/3.5/common.cf
body classes if_repaired(x) { promise_repaired => { "$(x)" }; }
cf-promises -cf ./test2.cf cf-agent -KInf ./test2.cf cf-agent -KInf ./test2.cf
Implicitní cyklus: test3.cf
body common control{ bundlesequence => { "example" }; } bundle agent example { vars: any:: "v[index_1]" string => "value_1"; "v[index_2]" string => "value_2"; "x" slist => getindices("v"); "y" slist => getvalues("v"); reports: any:: "All indices:"; " Found index: $(x) with value \"$(v[$(x)])\""; "All values:"; " Found value: $(y)"; "Kombinace $(x) $(y)"; }
Proměnné třídy: test4.cf
body common control { bundlesequence => { "example" }; } bundle agent example { vars: any:: "distro" slist => { "redhat", "debian", "suse", "leopard" }; "os" slist => { "linux", "solaris", "windows" }; reports: any:: "Tento system je na operacnim systemu ${os} s distribuci ${distro}." ifvarclass => "${distro}.${os}"; "Toto NENI ${os} na distribuci ${distro}" ifvarclass => "!(${distro}.${os})"; }
První kontakt
cf-agent --bootstrap cf.civ.zcu.cz
Co jsme získali?
ls /var/cfengine/inputs ls /var/cfengine/masterfiles
Jak udělat změnu
Příprava gitu
apt-get install git git config -l git config --global user.name "Tvoje Jmeno" git config --global user.email tvuj_login@civ.zcu.cz
Klon
cd /root git clone file:///afs/zcu.cz/project/software/git/cfengine.git cf git clone ssh://svamberg@eryx.zcu.cz/afs/zcu.cz/project/software/git/cfengine.git cf cd cf git checkout production git branch --set-upstream production origin/production
Změna v gitu a propagace
cd /root/cf git checkout -b zmena git branch vim file.cf cf-promises -cf ./promises.cf cf-agent -KnIf ./promises.cf git status git commit file.cf git checkout master git merge zmena git push git checkout production git merge zmena git push
Struktura masterfiles
Vychází se z předpokladu, že nejnovější je vždy vývojová větev, proto by neměl být problém "upgradnout" z production do master:
- Stroj si stáhne minimální konfiguraci z cf:/var/lib/cfengine/masterfiles/*
- Spustí update.cf, který stáhne cf:/var/lib/cfengine/masterfiles_branches/production/*
- Spusti update.cf, pokud zjistí, že má používat testovací větev, stáhne cf:/var/lib/cfengine/masterfiles_branches/master/*
Jak budou řešeny učebny ještě není úplně rozhodnuto, ale budou mít samostatný GIT repozitář.
Kořen
ls /root/cf/
- update.cf: samostatný, nezávislý kód (vyjma def.cf), pouští se před promises.cf a má za úkol aktualizovat úložiště
- promises.cf: 'main" odkud se řídí zpracování (def.cf, lib, inventory, services, ...)
- def.cf: definuje větev, defaultně 'production', vyjmenované stroje mají 'master'
- hosts.cf: definuje skupiny převážně dle hostname
- services.cf: rozstřel pro služby na základě tříd definovaných z inventáře, def.cf a hosts.cf
- ...
lib vs. zculib
- Standardní a naše bundly a body. Děleny podle typu promise (files, packages, ...) nebo logiky.
- Zpracovávají se jako jedny z prvních.
- neobsahuje vse ale zaklad tam je, lze rozsirovat (mame zculib) nebo prispet do github
inventory vs. zcuinventory
Spouští se před začátkem služeb, mají za úkol nastavit globální třídy na základě stavu stroje a jeho HW.
- zatim pouze vlastni zcuinventory, od 3.6 prijde i systemova, prvni nastrel na github
- snazi se osahat system a predpripravit tridy na zaklade HW/SW informaci od systemu
services
Sbírka politik podle služeb a skupin, které provozujeme. Používá se jednotné pojmenování:
services/SLUZBA/SLUZBA.cf => z promises.cf volá 'bundle agent SLUZBA' services/SLUZBA/PODSLUZBA.cf => bundle agent SLUZBA_PODSLUZBA, bundle agent SLUZBA_PODSLUZBA_DETAIL
Například v services/kerberos/kerberos.cf:
bundle agent kerberos { methods: any:: "any" usebundle => kerberos_config, comment => "Spravuje /etc/krb5.conf"; "any" usebundle => kerberos_k5login, comment => "Spravuje /root/.k5login soubor"; }
Bundl 'kerberos_k5login' je v souboru services/kerberos/k5login.cf, zde se volají již specifické bundly 'kerberos_k5login_allow' (možno dát i do samostatného souboru k5login_allow.cf).
files
Obdobná struktura jako ve FAI pro fcopy. Definováno v zculib/fcopy.cf, lze volat
fcopy(cesta, verze) => vždy aktualizuje z repozitáře fcopy_add(cesta, verze) => jen pokud neexistuje cílový soubor
Log o kopírování je vždy generován.
Použití např. v services/kerberos/config.cf:
bundle agent krb_config { methods: any:: "any" usebundle => fcopy("/etc/krb5.conf", "default"); }
modules, templates
Zatím nebylo potřeba použít.
sketche
- neni standardni soucasti, vlastne formular, ktery pripravi .cf soubor (apache, myslq, ...)
- hodne ve vyvoji, neplanujeme nasadit, jedine "funkcni" instalace na youtube