Foreman je open-source aplikace pro kompletní správu infrastruktury pokrývající (automatizovanou) instalaci operačního systému, následnou konfiguraci za pomoci Puppetu a monitoring konfigurace. Foreman podporuje distribuce Red Hat, Fedora, Suse, Debian, Ubuntu, Solaris a další, umí instalovat a konfigurovat holé železo, virtualizované systémy (libvirt, oVirt, RHEV, VmWare) i systémy v cloudu (OpenStack, EC2, Rackspace a další).

Cílem mého článku je krátce představit náš open-source projekt a poté detailně projít ukázkovou instalaci na jednoduchou infrastrukturu. Jelikož existuje mnoho možností instalace a konfigurace Foremana samotného, v příkladu nainstaluji Foreman a všechny podpůrné služby na jeden (virtuální) stroj a spravovat bude možné jen jedinou (virtuální) síť. Chtěl jsem zejména umožnit těm, kteří nikdy Foremana nezkoušeli, aby si jej mohli snadno osahat. Konkrétně se jedná o verzi 1.3, která byla v době psaní článku aktuální.

Ačkoliv je článek víc o tom, jak Foreman nainstalovat a nastavit, krátce před začátkem instalace bychom se mohli podívat na to, co Foreman umí. Jsou to dvě oblasti - instalace operačních systémů a integrace s konfiguračním nástrojem Puppet. Obě věci lze používat zároveň, při čemž se projeví síla Foremanu v kompletní správě životního cyklu instalovaných počítačů, případně jednu bez druhé. Znám uživatele, kteří jen automatizují instalace systémů a konfiguraci provádějí jinak, stejně jako uživatele, kteří volí cestu vlastních instalací (např. z obrazů) a používají bohaté uživatelské prostředí Foremana pro nastavování a monitoring Puppetu.

Práce s Foremanem je přímočará, instalované systémy se buď předem registrují ve webovém uživatelském prostředí, nebo Foreman zajistí jejich vytvoření rovnou při registraci. První způsob je nutný při instalaci přes síť (holé železo, virtualizace), druhý při spouštění již existujících obrazů (virtualizace, cloud).

Foreman obsahuje šablony se syntaxí podobnou ERB (něco jako PHP), což je alfou a omegou celého řešení. Úkolem Foremana je především zajišťovat vytvoření různých konfiguračních souborů potřebných pro dané akce. Je to zejména například menu PXELINUXu (gPXE/iPXE/PXEGrub) a kickstart pro Anacondu (preseed pro Debian/Ubuntu a podobně). Existuje více typů šablon, ale tyto jsou nejdůležitější.

Nedílnou součástí je komponenta smart-proxy (někdy nazývaná foreman-proxy), kterou lze instalovat na počítače zajišťující služby DHCP, TFTP, DNS a Puppet Master. Může se jednat o jeden počítač nebo i více serverů. Je obvyklé definovat více instancí smart-proxy pro jednotlivé sub-organizace, fyzické sítě nebo datacentra. V uživatelském rozhraní se proxy nadefinuje pro dané entity, takže při vybrání požadované sítě (například) bude použita správná proxy.

Tato komponenta, jež je malou Ruby aplikací s rozhraním HTTPS REST, provádí potřebné konfigurační zásahy typu "vytvoř rezervaci IP pro MAC adresu xyz" nebo "vytvoř DNS záznamy pro hosta xyz". Proxy dokáže integrovat jak se standardními démony (ISC BIND, ISC DHCP), tak s exotickými (MS DHCP).

Podobně se komunikuje s Puppet Masterem, na který je potřeba standardní cestou nainstalovat Puppet moduly. Jejich názvy a parametry (class parameters) lze do Foremana poté snadno importovat, a to i opakovaně. V uživatelském rozhraní se definuje, jaké parametry lze nastavovat při vytváření systémů, a tyto koncoví uživatelé zadávají (např. port pro httpd démona, název uživatelského účtu nebo typ požadované databáze pro aplikaci).

Hlavní workflow s Foremanem je vytvoření nového systému (host), nastavení potřebných parametrů pro instalaci i konfiguraci a spuštění. Instalační proces lze sledovat přímo z webového prostředí pomocí HTML5 komponenty přes VNC/Spice. Následně lze konfiguraci instalovaných strojů v čase monitorovat a provádět konfigurační úpravy pomocí Puppetu nebo nástroje pro vzdálenou správu MCollective.

foreman-dashboardInstalace

Ačkoliv se architektura Foremana může zdát někomu složitá, instalaci typu "vše v jednom" vhodnou pro otestování funkčnosti lze provést za jedno odpoledne. Hlavní síla Foremana je však ve správě rozmanité infrastruktury přes několik datových center. Tomu se z logických důvodů pro didaktické účely vyhneme a vystačíme si s jednoduchou topologií.

Ukázková instalace bude provedena na operační systém RHEL6 (můžete použít jakýkoli klon) a celá síť, kterou bude Foreman spravovat, bude virtuální. K tomu použijeme libvirt a jako virtualizaci KVM. Opět platí, že můžete najít jiné vhodné nástroje pro tvorbu virtuálních strojů a sítě.

Hardwarovým předpokladem je jakýkoliv počítač s podporou virtualizace a alespoň 2 GB paměti, abychom mohli vytvořit hosta pro Foreman samotný (500 MB), a pak si vyzkoušet nainstalovat a provozovat alespoň dva systémy souběžně. Toto pochopitelně nejsou doporučené hodnoty nastavení paměti pro nasazení do provozu.

Instalace hostitele samotného se nijak neliší od standardní serverové instalace systému RHEL6. Stačí nám nainstalovat podporu virtualizace, konkrétně libvirt démona a případně virt-manager, pakliže preferujete klikání. Ještě než začneme se samotnou instalací, dodám, že je možné použít i Fedoru.

Před vytvořením hosta pro Foremana musíme vytvořit novou virtuální síť. To lze provést naklikáním přes virt-manager nebo z příkazové řádky. Je nutné u této nové NAT sítě, kterou jsem nazval "virtual", vypnout (opakuji vypnout) službu DHCP, kterou zajišťuje dnsmasq. Stejně tak smažte nastavení domény. Osobně rád ponechávám základní síť se jménem "default" (kterou obvykle nastavuji na bridge), ale můžete ji smazat.

V případě použití příkazu virsh si v editoru připravte následující soubor. Můžete také vycházet z konfigurace stávající sítě "default", kde smažte sekci dhcp z tagu ip a všimněte si, že se jedná o klasický NAT. Rozhraní je v mém případě virbr1 (na virbr0 mám bridge do sítě "default") a zvolil jsem lépe zapamatovatelný rozsah 192.168.100.0 (můžete zvolit dle libosti a dostupnosti):

<network>
  <name>virtual</name>
  <uuid>f00c9416-0b28-3cbf-4144-b9b95bd3c651</uuid>
  <forward mode='nat'/>
  <bridge name='virbr1' stp='on' delay='0' />
  <mac address='52:54:00:20:1F:20'/>
  <ip address='192.168.100.1' netmask='255.255.255.0'>
  </ip>
</network>

Ještě jednou zkontrolujte, zda v XML souboru nejsou tyto položky:

  <domain name='local'/>

Nebo:

<dhcp>
  <range start='192.168.100.2' end='192.168.100.254' />
</dhcp>

Pokud ano, znovu opakuji (již naposled) - smažte ty řádky. Nyní lze síť definovat

[hypervisor]# virsh net-define virtual cesta/ke/souboru.xml
[hypervisor]# virsh net-edit virtual

Nezbývá nám nic jiného než síť nastartovat:

[hypervisor]# virsh net-start virtual

Poznámka: Systém RHEL6 ještě nedisponuje dynamickým firewallem. Pokaždé, když změníte nastavení firewallu restartem, je nutné restartovat službu libvirtd, která přidá potřebná NAT pravidla.

Nyní můžeme přistoupit k instalaci hosta (virtuální počítač) pro Foreman, já jsem použil opět RHEL6 a během instalace jsem nastavil statickou IP adresu na 192.168.100.2. Toto je důležité - Foreman musí být dostupný na této adrese. A také jsem nastavit hostname na foreman.virtual.lan. Podle toho instalátor odvodí, jaká bude doména celé sítě (virtual.lan). Zbytek můžete instalovat podle chuťi - já jsem zvolil standardní serverový set balíků a žádné změny. Po instalaci jsem RHEL6 zaregistroval, připojil k předplatnému a aktivoval optional repozitář.

Pozor: Následující kroky jsou již spouštěny na vytvořeném virtuálním počítači (guestu) určeném pro Foremana samotného. U příkazů budu pro jistotu uvádět hostname ([foreman]). Podobně budu označovat hostitele [hypervisor], aby nedošlo k mýlce.

Po instalaci jsem ověřil, zda funguje internetové spojení a DNS, a také jsem ověřil, jestli je správně nastaven hostname a odpovídá na ping. A také jestli je funkční internet.

[foreman]# hostname -f
foreman.virtual.lan
[foreman]# hostname -s
foreman
[foreman]# hostname
foreman.virtual.lan
[foreman]# ping foreman.virtual.lan
[foreman]# ping 8.8.8.8
[foreman]# ping www.google.com
...

Pokud něco z toho nefunguje, je třeba správně nastavit /etc/hosts, kde záleží na pořadí na jednotlivých řádků. Více informací najdete v samostatném článku.

Samotná instalace "vše v jednom" je pomocí instalátoru založeného na Puppetu snadná, rychlá a zejména spravovatelná do budoucna. Nejprve je třeba aktivovat repozitář EPEL (v případě Fedory tento krok vynechte):

[foreman]# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Nyní stačí nainstalovat instalátor (verzi nastavte na aktuální stabilní - v době psaní článku to byla 1.3). Podporujeme také Fedoru, URL ale bude mít trošku jiný tvar.

[foreman]# yum -y install http://yum.theforeman.org/releases/1.3/el6/x86_64/foreman-release.rpm
[foreman]# yum -y install foreman-installer

A nyní jen stačí udělat si kafe, protože instalátor všechnu práci provede za nás. Ne nadarmo je instalační komponenta pojmenovaná kafo (katello, foreman). Tento projekt se dá využít pro tvorbu libovolného instalátoru založeného na Puppetu. Před spuštěním se můžete podívat na volby, které nabízí.

[foreman]# foreman-install -h

Všechny tyto volby jsou vlastně parametry (class variables) pro Puppet, takže pakliže chcete instalaci Foremanu samotného automatizovat (třeba přes jiný Foreman), toto jsou vstupy, které chcete zadávat.

foreman-hostsV našem případě "vše v jednom" ve virtuální síti je situace trošku zjednodušená. Standardně instaluje instalátor pouze službu TFTP a Foreman samotný (aby nechtěným spuštěním DNS/DHCP neprováděli méně zkušení uživatelé v sítích paseku). My ale víme, co děláme, takže aktivujeme instalaci všech třech potřebných služeb pro instalace po síti: TFTP, DHCP a DNS. Poslední jmenovaná služba vlastně není pro instalace potřeba, ale je to pro naše pohodlí.

Instalátor tedy nejen že instaluje aplikaci Foreman, ale zároveň také jednu komponentu Smart Proxy a zmíněné služby (ISC), tedy tftp přes xinet.d, dhcpd a named. Zbývá dodat, že nastavuji rozsah pro DHCP od 100.10 do 100.200 - nastavte dle uvážení a také podle toho, jakou virtuální síť jste vytvořili.

[foreman]# foreman-installer \
    --foreman-proxy-tftp=true \
    --foreman-proxy-dhcp=true \
    --foreman-proxy-dhcp-range="192.168.100.10 192.168.100.200" \
    --foreman-proxy-dns=true \
    --foreman-proxy-dns-forwarders=192.168.100.1

Samotná práce instalátoru chvíli potrvá, instaluje balíčky, konfiguruje a spouští jednotlivé služby, naplňuje databázi (PostgreSQL) a registruje Smart Proxy do instance. Až je vše hotovo, doporučuji se přesdvědčit, zda nenastaly nějaké chyby:

[foreman]# grep ERROR /var/log/foreman-installer/foreman-installer.log

Pokud ano a třeba jste spletli rozsah pro DHCP nebo zkrátka chcete přidat nějakou volbu navíc, prostě jen znovu spusťte instalátor s jinými parametry a Puppet vše překonfiguruje. Ve výjimečných případech při neznámé chybě může pomoct pouhé znovuspuštění instalátoru se stejnými parametry a chyba sama "vymizí" (stává se to při chybějící závislosti mezi službami).

foreman-host_detailJeště než se pustíme do nastavování potřebných věci v uživatelském prostřední Foremana, provedeme jeden malý "fígl". Na hostiteli (hypervisoru) jsem přidal do systémového dnsmasqu DNS server na hostu foreman.virtual.lan a změnil nastavení DNS v systému tak, aby veškeré dotazy šly přes kešující dnsmasq:

[hypervisor]# cat /etc/dnsmasq.d/virtual.lan
server=/virtual.lan/192.168.100.2
server=/100.168.192.in-addr.arpa/192.168.100.2

[hypervisor]# grep -v ^# /etc/dnsmasq.conf | sort -u
bind-interfaces
conf-dir=/etc/dnsmasq.d
listen-address=127.0.0.1
resolv-file=/etc/resolv.dnsmasq

[hypervisor]# cat /etc/resolv.dnsmasq
# zde jsou vaše DNS servery
nameserver 8.8.8.8
nameserver 8.8.4.4

[hypervisor]# cat /etc/resolv.conf
nameserver 127.0.0.1

Malá poznámka - pokud se jako já často připojujete do nějaké VPN sítě s předem danou doménou (např. redhat.com), vytvořte si podobně také soubor /etc/dnsmasq.d/redhat.com a zabraňte NetworkManageru nebo VPN klientovi ve změně /etc/resolv.conf pomocí read-only příznaku. Takhle to všechno může fungovat dohromady zcela bez problémů.

Po restartování služby dnsmasq vyzkoušejte, zda funguje resolving ven a do virtuální sítě "virtual". Pakliže dnsmasq při restartu píše "Host not found", přidejte hostname hostitele do /etc/hosts.

[hypervisor]# host lukas.zapletalovi.com
lukas.zapletalovi.com is an alias for lzap.github.com.
lzap.github.com is an alias for github.map.fastly.net.
github.map.fastly.net has address 199.27.77.133

[hypervisor]# host foreman.virtual.lan
foreman.virtual.lan has address 192.168.100.2

Jelikož já neinstaluji na stanici/notebooku ale na vzdálený hypervisor, do sítě virtual.lan mi to neroutuje. Následující odstavec tedy přeskočte, pokud jste neinstalovali na vzdálený server, ale například do libvirtu na notebooku. Jedná se totiž o druhý "trik" pomocí kterého lze pohodlně vzdáleně přistupovat do virtuální sítě, aniž by bylo dostupné přímé spojení.

V podstatě udělám ssh tunel na hostitele pomocí OpenSSH, který bude fungovat zároveň i jako SOCKS5 proxy (port 8890). Pro větší pohodlí nainstaluji skript, který mi automaticky nastaví tuto proxy v prohlížeči, kdykoliv navštívím hostname něco.virtual.lan. Toto lze provést přes různá rozšíření pro Chrome nebo Firefox, ale jelikož nepoužívám KDE ani Gnome, tyto nefungují a já si vytvořím PAC skript ručně. A poslední věc pro zrychlení práce s shelly - ssh nakonfiguruji tak, aby na stroje cokoli.virtual.lan šel skrz mašinu hostitele (hypervisor.xyz.redhat.com).

[notebook]$ cat ~/.ssh/config
Host hv
    HostName hypervisor.xyz.redhat.com
    DynamicForward 8890

Host *.virtual.lan
    User root
    GSSAPIAuthentication no
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
    ProxyCommand ssh -A hypervisor.xyz.redhat.com nc %h %p

[notebook]$ cat ~/proxies.pac
function FindProxyForURL(url, host) {
  if (shExpMatch(url, "*.virtual.lan*")) {
    return "SOCKS5 localhost:8890";
  } else {
    return "DIRECT";
  }
}

[notebook]$ google-chrome --proxy-pac-url=file:///home/lzap/proxies.pac &>/dev/null &

Nyní mi vše funguje téměř jako bych seděl u serveru. Za tyto triky děkuji Dominicovi Clealovi, něco podobného jsem používal, ale on to dovedl k dokonalosti pomocí SOCKS řešení. K výše uvedenému malá poznámka - tunel funguje, jen když se člověk přihlásí pomocí ssh na stroj hypervisor.xyz.redhat.com, ale to je snad u ssh tunelování jasné.

Dokončení příště...