LPS:CFEngine3

Z HelpDesk
Verze z 23. 5. 2023, 17:38, kterou vytvořil Svamberg (diskuse | příspěvky) (ruseni rozsireni pro graphviz)
(rozdíl) ← Starší verze | zobrazit aktuální verzi (rozdíl) | Novější verze → (rozdíl)

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

Odkazy