Dostáváme se zpět k instalaci Foremana. Ta byla sice již dokončena a my se můžeme přihlásit, ale než nainstalujeme první server, musíme ještě provést pár úkonů.

...dokončení prvního dílu.

Pokud máte chvíli času, doporučuji nechat instalaci "uzrát" ještě alespoň třicet minut, během které Puppet poprvé provede registraci hosta samotného a v uživatelském rozhraní se v seznamu Hosts objeví nový záznam s názvem foreman.virtual.lan.

První věc, na kterou se zaměříme, je právě záznam foreman.virtual.lan. Klikněte na Hosts a vyberte tuto (jedinou) položku v seznamu a trošku to proklikejte. Všimněte si, že tento host nemá aktivní tlačítko Build - nelze jej reinstalovat. Registrované systémy totiž dělíme do dvou skupin. Managed jsou ty, které se instalovaly přes Foreman, unmanaged (to je tento případ) jsou ty, které do Foremana přidal Puppet, případně ručně uživatel. Ty nelze automatizovaně přeinstalovat, ale je možné převést záznam do režimu managed a poté to provést.

Někoho může mást pojem "host", ten byl zvolen patrně proto, že Foreman se často používá pro instalaci a správu virtualizačních nebo cloudových serverů, takže neinstalujeme hosty (guests), ale hostitele (hosts). Proběhlo několik diskusí ne téma přejmenování, zatím ovšem nevedly k žádnému konsenzu.

foreman-chartZkontrolujeme, zda instalátor nastavit a zaregistroval Smart Proxy. Je to komponenta, se kterou Foreman komunikuje pomocí REST HTTPS API. Ta zprostředkovává komunikaci se službami TFTP, DHCP, DNS a Puppet Master. V každé síti, ve které chcete instalovat nebo konfigurovat, je potřeba alespoň jedna proxy instance. V našem případě je proxy již nainstalovaná na stejném systému, kde běží Foreman.

Přejděte tedy do menu (vpravo nahoře) More - Configuration - Smart Proxies a ověřte, že instance je zaregistrovaná. Má stejný název jako hostname stroje, tedy foreman.virtual.lan. Také by měla nabízet všechny dostupné služby: DHCP, DNS, Puppet, Puppet CA a TFTP.

Abychom nemuseli všechny informace o síti zadávat v dalším kroku ručně, Foreman umí načíst část informací ze serveru DHCP. V seznamu Smart Proxy klikněte na rozbalovací menu u položky foreman.virtual.lan a zvolte Import Subnet. Naše topologie je triviální, máme jen jednu síť 192.168.100.0, kterou Foreman nabídl. Zbývá doplnit pár informací: gateway, dns (oba 192.168.100.1), ip range (výše uvedený rozsah 10-200), zaškrtnout, do jaké domény síť patří (virtual.lan), a u položek DHCP, TFTP a DNS proxy zvolit ve všech případech foreman.virtual.lan. Aby se to nepletlo, pro tuto síť jsem zvolil název "virtual.lan".

foreman-subnet_editNyní se zaměříme na menu More - Provisioning. Klikněte na položku Domains. Instalátor pro Foreman 1.3 sice zaregistruje proxy, ale již ji nespáruje s ostatními objekty. Klikněte tedy na detail domény virtual.lan a změnte DNS Proxy z None na foreman.virtual.lan. Foreman nyní ví, že kdykoli bude potřebovat provést změnu v této doméně, kontaktuje danou proxy (která provede změnu na našem DNS serveru). V budoucnu se chystáme tyto kroky automatizovat přímo instalátorem.

Klikněte na Architectures a pokud jste počkali minimálně zmíněných třicet minut, tak již přišel první report z Puppetu a Foreman vytvořil architekturu a operační systém automaticky. Pokud jste instalovali Foremana na 64bitové platformě, uvidíte v seznamu x86_64. Klikněte na detail této architektury a zaškrtnutím ji asociujte s vytvořeným systémem "RedHat 6.4".

Pokud přemýšlíte, proč Foreman vytvořil systém pod názvem RedHat a ne třeba RHEL, je to z toho důvodu, že tyto informace takto podává Puppet. Přejděte do položky Operating Systems, kde uvidíte po rozkliknutí položky RedHat 6.4 všechny detaily nově vytvořeného systému. Pokud tuto položku přejmenujete na RHEL 6.4, zhruba po třiceti minutách Foreman vytvoří položku novou pod původním názvem. Proto doporučuji zůstat u tohoto názvosloví. K definici operačního systému se za chvilku vrátíme.

Nyní nadefinujeme, odkud se budou operační systémy instalovat. Klikněte na Installation Media. Na následující obrazovce je několik předdefinovaných adres pro systémy Fedora, CentOS, OpenSuse a Ubuntu. Pokud chcete instalovat přímo z internetu, stačí, když si URL upravíte na bližší zrcadlo. V řetězci lze použít několik proměnných jako $arch, $version, $major a $minor. Jsou zmíněny na obrazovce Edit Medium. Rozklikněte položku CentOS a asociujte ji se systémem RedHat 6.4.

V mém případě si však navíc přidám vlastní repozitář obsahující RHEL 6.4, aby byla instalace rychlejší. Je to triviální - kliknul jsem na New Medium, zvolil vhodný název, URL a asocioval s OS Family RedHat. Existuje jednoduchý trik, jak pomocí autofs připojit a exportovat přes HTTP nebo NFS instalační stromy přímo z ISO souborů, což je popsáno níže.

foreman-new_mediumNyní zrevidujeme položku v menu s názvem Partition Tables, konkrétně nás zajímá jedna s názvem "RedHat default". Jedná se v podstatě o část kickstartu, která vytváří oddíly na disku. Měnit ji nebudeme (základní nastavení autopart nám postačí), ale zkontrolujte, zda je OS Family nastavena na RedHat. Pokud ne, asociujte záznam.

Šablony

Už jsme skoro u konce, nyní nastává ta nejzajímavější část - šablony. Nejprve trocha teorie, jak to celé funguje. Automatická instalace přes síť je u všech linuxových distribucí podobný proces. Pro naše účely budeme používat bootování přes PXE pomocí PXELINUXu. Při tomto způsobu jsou všechny spravované servery nastaveny pouze na bootování přes síť, aby bylo možné je kdykoli na dálku přeinstalovat.

Před startem instalace se ve Foremanu vytvoří záznam hostitele (New Host), kde je mimo jiné MAC adresa. Poté Foreman vytvoří podle námi zvolené šablony na serveru TFTP soubor pro daného hosta (právě podle MAC) z šablony PXELinux, kterou předem spárujeme s daným operačním systémem.

V tomto souboru je odkaz na jádro, které se bude bootovat, a také odkaz na předpis instalace, což je v případě Red Hatů kickstart soubor. Ten se stáhne přes http přímo z Foremana, přičemž ten jej generuje z šablony typu Provision, kterou opět předem spárujeme s daným OS. Jaká data má Foreman do šablony předat, pozná podle IP adresy, kterou zná také - na DHCP serveru se totiž vytvoří rezervace pro danou MAC a IP předem.

Poté instalátor (v našem případě Anaconda) instalaci provede a po dokončení je v kickstartu volání zpět do Foremana pomocí wgetu, který hostitelský záznam přepne do hotového stavu. V tuto chvíli Foreman vymaže ze serveru TFTP startovací PXE boot menu pro daný stroj a po restartu se sice server znovu pokusí o boot ze sítě, nicméně dostane výchozí PXE boot menu s jedinou položkou - startuj z lokálního disku. Toto menu je opět generováno pomocí šablony PXELinux, která je však pro všechny stroje stejná.

foreman-templatesDoufám, že jsem vás nevylekal. Z toho všeho nám nyní vychází, že musíme nachystat dvě šablony: jednu pro PXELinux a druhou pro Anacondu. Foreman nabízí jednoduchý šablonovací jazyk ERB. Pokud jste někdy psali v PHP nebo Ruby webovou aplikaci, je to podobné. Z bezpečnostních důvodů je však dostupné jen několik funkcí a proměnných - ovšem tolik, aby bylo možné šablony dostatečně parametrizovat. Typicky si vystačíte s jedinou šablonou na celou vaši infrastrukturu.

Naštěstí nemusíme začínat s čistým stolem - Foreman v základní instalaci nabízí již hotové a plně funkční šablony jak pro PXELinux, tak i pro systémy Red Hat, Fedora, Suse, Debian a Ubuntu. Naším úkolem je tedy jen vybrat ty správné šablony typu PXELinux a Provision.

Prozradím, že jimi jsou Kickstart default PXElinux a RHEL Kickstart Default. Můžete je zrevidovat, první jmenovaná nepotřebuje žádnou změnu, druhá taktéž funguje přímo, ale zřejmě budete chtít upravit seznamy instalovaných balíků a změnit některá nastavení (časová zóna a podobně). Hlavně je třeba u obou jmenovaných šablon na kartě Association zaškrtnout systém RedHat 6.4. U každé změny je vhodné připsat komentář do pole Audit. Všechny změny jsou zaznamenány podobně, jako u Gitu nebo Subversionu a lze se kdykoliv vrátit k předešlé verzi.

Pokud by vás zarazily dvě velmi podobné šablony s názvem RHEL Kickstart Default a Kickstart Default tak vězte, že první jmenovaná je obohacená o registraci systému pomocí utility subscription-manager. U placené podpory je třeba systém Red Hat Enterprise Linux před použitím zaregistrovat a připojit k předplatnému, jinak nebude dostávat aktualizace. Tato část se nachází v podšabloně (snippetu) redhat_register, která je vložená do postinstalační části kickstartu. Pakliže instalujete CentOS, asociujte Kickstart Default, kde nic takového není.

Malá ukázka toho, jak taková šablona vlastně vypadá (PXELinux):

default linux
label linux
kernel <%= @kernel %>
append initrd=<%= @initrd %> ks=<%= foreman_url("provision")%> ksdevice=bootif network kssendmac

Vidíme dosazení nějakých proměnných (např. @kernel) a zavolání jedné z několika dostupných funkcí. V našem případě je to foreman_url vracející URL šablony pro daný systém typu "provision". Jak tušíte, jedná se o kickstart pro Anacondu.

Existuje ještě několik jiných typů šablon, ze kterých bych jmenoval zejména typ Finish, který se používá při cloud provisioningu - Foreman spouští daný skript přes ssh na nastartovaném obrazu. A také typ Script, který lze kdykoliv stáhnout přes wget/curl a přesměrovat do shellu dle přání uživatele. Tento typ se dá použít k primitivnímu konfigurování, pokud by někomu nevyhovoval Puppet.

Jelikož šablony se mohou v průběhu života instalace Foremana měnit (např. vyjde nová Fedora s novou funkčností v Anakondě), je vhodné udržovat šablony aktuální. Proto existuje github.com repozitář s názvem community-repos v organizaci foreman, kde lze najít nejaktuálnější šablony pro veškeré podporované operační systémy.

Při prvotním zaregistrování Foremana samotného nám sice Puppet dodal nějaké informace o daném systému, ale nemá k tomu žádný kontext. My nyní musíme doplnit informace o tom, jak takový Red Hat verze 6.4 budeme instalovat, a odkud. K tomu nyní přejdeme do Operating Systems a využíjeme všechny položky, které jsme si tak pracně definovali. Po rozkliknutí "RedHat 6.4" zkontrolujeme, zda OS Family je nastavená na "RedHat" a architektura na x86_64. Partition table zvolíme "RedHat default" a Installation media CentOS (pokud hodláte instalovat raději CentOS), nebo vlastní (v mém případě je to Red Hat Brno RHEL Globalsync - eventuálně si nastavte instalační URL na lokálně připojené ISO).

foreman-edit_osNež obrazovku Edit OS zavřete, přejděte na položku Templates a zvolte správně šablony pro PXELinux (Kickstart default PXELinux) a Provision (Kickstart Default pro CentOS nebo RHEL Kickstart Default pro RHEL). Uložte, a máme vše připravené.

Poznámka: Pokud z nějakého důvodu nemůžete nic zvolit nebo zaškrtnout, je to proto, že jste dané elementy neasociovali. Vše bylo popsáno výše, projděte si text ještě jednou.

První automatizovaná instalace

Ačkoli Foreman umí komunikovat s virtualizačními technologiemi jako libvirt, oVirt/RHEV a VmWare, případně s cloudem jako OpenStack, EC2 nebo Rackspace, pro naše účely si napoprvé nasimilujeme provisioning holého železa.

Pomocí virt-manageru nebo virt-installu vytvoříme nový stroj s předem známou MAC adresou a bootováním pouze ze sítě, vložíme jej do Foremana a poté stroj zapneme. Proběhne kompletní instalace systému RHEL6 (CentOS6) a restart.

Přejděte do Hosts, New Host a zadejte postupně Name (demo1), Environment (production), Puppet CA a Master (obě pole foreman.virtual.lan), další stránku Puppet classes přeskočíme, na stránce Network volíme MAC (52:54:00:aa:bb:01), Domain (virtual.lan), Subnet (virtual.lan) a IP adresa by se nám měla předvyplnit z daného rozsahu (.10 - .200). MAC adresu můžete opravdu zvolit tuto, protože instalujeme do virtuální sítě a bude s velkou pravděpodobností jedinečná.

Na další stránce volíme Architecture (x86_64), Operating System (RedHat 6.4), Media (Red Hat Brno/ISO nebo CentOS dle situace), Partition table (RedHat default) a zadáme nějaké root heslo. To je vše, můžeme uložit pomocí tlačítka Submit.

Nyní je vše připravené k instalaci po síti, což si můžeme snadno ověřit:

[foreman]# find /var/lib/tftpboot/
/var/lib/tftpboot/
/var/lib/tftpboot/pxelinux.0
/var/lib/tftpboot/memdisk
/var/lib/tftpboot/pxelinux.cfg
/var/lib/tftpboot/pxelinux.cfg/01-52-54-00-aa-bb-01
/var/lib/tftpboot/boot
/var/lib/tftpboot/boot/RedHat-6.4-x86_64-vmlinuz
/var/lib/tftpboot/boot/RedHat-6.4-x86_64-initrd.img
/var/lib/tftpboot/menu.c32
/var/lib/tftpboot/chain.c32

Foreman nám na TFTP server nakopíroval jádro a init ram disk a také vytvořil speciální konfiguraci pro danou MAC adresu, která se při startu použije a bude pokračovat bootováním jádra RedHat-6.4-x86_64-vmlinuz a instalací přes Anakondu.

Následující dva odstavce můžete provést přes grafický nástroj virt-manager, ale já preferuji konzolové aplikace - vyhneme se tak případné chybě. Pokud chcete jít stejnou cestou, nainstalujte si dva programy:

[hypervisor]# yum -y install virt-install virt-viewer

Nyní "zapneme" náš nový server, který jsme právě zapojili do pomyslného racku.

[hypervisor]# virt-install --os-variant rhel6 \
    --vcpus 1 \
    --ram 500 \
    --name demo1 \
    --boot network\
    --disk pool=default,size=3 \
    --graphics spice \
    --noautoconsole \
    --network network=virtual,mac=52:54:00:aa:bb:01

Všimněte si, že MAC adresa je stejná, jako jsme zadávali do Foremana. To je důležité, jinak by se nám server snažil bootovat z lokálního (prázdného) disku. V našem příkladě jsme zvolili místo VNC protokol Spice, takže nyní můžeme sledovat průběh instalace.

# virt-viewer -c qemu+ssh://root@hypervisor.xyz.redhat.com/system demo1

Pakliže startujete na lokálním počítači, je to něco jako

# virt-viewer -c qemu:///system demo1

Všimněte si, že během instalace v seznamu Hosts je u položky demo1.virtual.lan ikona "B" od slova Build. V detailu je tlačítko Cancel Build, které se po dokončení instalace změní zpět na Build. To znamená, že Foreman smaže z TFTP serveru konfiguraci pro danou MAC adresu a server bude bootovat z lokálního disku.

Jakmile se instalace dokončí, nejpozději do třiceti minut (většinou ihned) by se měl spustit Puppet. Jelikož jsme však neimportovali žádné Puppet manifesty a ani žádné na systém neaplikovali, kromě nahrání fakt (system facts) o systému nic neprovede. Konfigurace pomocí Foremana přesahuje hranici, kterou jsem si pro příspěvek vymezil. O tom snad někdy jindy.

Pokud chcete systém reinstalovat, stačí kliknout na tlačítko Build a poté systém restartovat.

Jak dál

Dalším krokem může být integrace s libvirtem, který po jednoduché konfiguraci firewallu na hypervisoru a nastavení autentizace lze ovládat přímo z Foremana. Nainstalujeme podporu pro libvirt a restartujeme Foremana.

[hypervisor]# yum -y install foreman-libvirt
[hypervisor]# service httpd restart

Pro přístup na libvirt je nutné nakonfigurovat ssh klíč. To provedeme takto:

[hypervisor]# su foreman
[hypervisor]# cd ~
[hypervisor]# ssh-keygen
[hypervisor]# ssh-copy-id root@192.168.100.1

V tuto chvíli by měl uživatel "foreman" být schopen připojení na hypervisor bez hesla, což nejdříve ověřte. Druhou možností (nedoporučuji pro produkční nasazení) je otevřít přístup přes TCP:

[hypervisor]# grep -v ^# /etc/libvirt/libvirtd.conf | sort -u
auth_tcp = "none"
listen_tcp = 1

Po přidání pravidla do firewallu a restartu daemona libvirt je možné se připojit přímo, což pro testování postačí. Ať už si zvolíte jakýkoli způsob, jděte do Provisioning - Compute Resources, klikněte na New a zvolte typ providera libvirt, jméno, adresu (qemu+ssh://root@192.168.100.1/system nebo qemu+tcp://root@192.168.100.1/system), Display Type doporučuji SPICE a volbu Random Console Password můžete vypnout, aby bylo možné se na konzoli připojovat i desktopovým klientem bez hesla (pro testování nám to nevadí).

foreman-libvirtNyní můžeme vytvoření nového systému zopakovat - Hosts - New. Ovšem s tím rozdílem, že u položky Deploy On zvolíme místo Bare Metal název našeho libvirt providera. Foreman nám předloží jednu obrazovku navíc s názvem Virtual Machine, kde zvolíme velikost paměti, počet procesorů, síťová rozhraní (zvolte Virtual NAT síť a Network "virtual") a disky. Poté vše probíhá stejně.

Některé virtualizační platformy podporují spouštění existujících obrazů (images), u cloudových platforem se jinak systémy nespouštějí. Foreman podporuje spouštění obrazů, ale v tom případě se již nebootuje ze sítě, ale použije se takzvaný Finish skript, který Foreman spustí v shellu přes ssh. Obvykle se v něm pouze nainstaluje a nastaví Puppet, ale fantazie se meze nekladou.

Výhodou u instalací ve virtualizaci nebo cloudu je možnost napojení se na konzoli systému přímo přes HTML5/JavaScript komponentu bez nutnosti zásuvných modulů, pokud to tedy technologie dovoluje. Tato možnost je dostupná přes tlačítko Console u těch systémů, které byly vytvořeny přes Compute Resource. U libvirtu to funguje skvěle.

Je vhodné se také seznámit s konceptem Host Group, kde je možné nadefinovat si předem parametry pro různé typy systémů. Pak lze jen vyplnit jméno a právě Host Group, čímž se předvyplní vše ostatní. Host Groupy lze vnořovat, což je užitečné zejména ve spojení s Puppet třídami.

foreman-spiceČasto je třeba instalovat základní serverové nebo minimální instalace operačních systémů (pro Red Hat je to Server nebo Minimal installation). Pakliže nemáte k dispozici bleskové připojení k internetu nebo nechcete servery z bezpečnostních důvodů vůbec do internetu pouštět, je potřeba repozitáře distribucí stáhnout a dát k dispozici lokálně. Stažení je věc jednoduchá (obvykle použijeme rsync), nastavit Foremana na lokální zdroje lze přes obrazovku Media, což je uvedené výše.

Existuje však jednoduchý trik, kterým lze předejít stahování kompletních stromů distribuce (například Fedora má několik desítek GB). Pro minimální nebo základní instalaci totiž stačí jen instalační médium, což je obvykle DVD nebo CD o standardní velikosti. Soubor ISO pak stačí jen "rozbalit" a vystavit přes HTTP nebo NFS. Lze to ale udělat i přímo pomocí automountu:

[hypervisor]# mkdir /var/www/html/repos
[hypervisor]# grep iso /etc/auto.master
/var/www/html/repos /etc/auto.isos
[hypervisor]# cat /etc/auto.isos
*   -fstype=auto,loop,ro    :/data/isos/&.iso
[hypervisor]# service autofs restart
[hypervisor]# ls /var/www/html/repos/Fedora-18-x86_64-DVD
EFI  images  isolinux  LiveOS  Packages  repodata  TRANS.TBL

V mém případě mám ISO soubory uložené v adresáři /data/isos a připojuji je tak, aby byly ihned dostupné přes démona httpd na adrese /repos. Pro ty, kdo neví, jak funguje automounter, připomenu, že je nutné do adresáře nejprve vejít, aby se připojil (v ukázce jsem připojil Fedora-18-x86_64-DVD.iso).

Ačkoliv jsme se prakticky nedotkli technologie Puppet a Foremana lze bez potíží provozovat bez podpory konfigurace, je dobré Puppet ponechat na instalovaných serverech aktivní, pokud je to možné. Součástí Puppetu je program nazvaný "facter", který periodicky zasílá statistické informace o systémech. Ty lze přehledně v uživatelském rozhraní zobrazovat do grafů, případně je využít ve vyhledávání - "hledej všechny systémy Ubuntu 10.04".

Do budoucna náš tým pracuje na podpoře MCollective, což je technologie pro vzdálenou správu. Přímo z uživatelského rozhraní tedy půjde provádět akce typu "nainstaluj vim na všech strojích Red Hat 6.4" nebo "vypni swap na strojích co mají více než 4 GB RAM". MCollective úzce navazuje na Puppet.

Foreman podporuje zásuvné moduly, ze kterých bych jmenoval dva: foreman discovery a foreman bootdisk. První jmenovaný přidává podporu speciálního minimalistického linuxového jádra, které se nabootuje na nově přidaných strojích. Ty se pak objevují přímo ve Foremanovi, což je výhodné pro ty organizace, které přidávají ("rackují") mnoho desítek serverů naráz. Není totiž třeba opisovat MAC adresy, rovnou se klikne a server se přebootuje do instalátoru.

Druhý jmenovaný plugin pomáhá automatizovat tvorbu bootovacích souborů ISO/flash, pomocí kterých lze alespoň částečně automatizovat instalaci tam, kde není možné použít bootování ze sítě. Pro kompletní seznam všech zásuvných modulů přejděte na Foreman wiki stránky.

Další informace včetně podrobné dokumentace lze najít na stránkách projektu.

Závěr

Cílem článku bylo představit představit open-source technologii Foreman pro automatizovanou instalaci linuxových operačních systémů a následnou konfiguraci za pomoci technologie Puppet, přičemž jsem si kladl za cíl zaměřit se zejména na instalaci holého železa po síti pomocí dostupných technologií PXELinux, TFTP, DHCP a DNS.

Budu vděčný za jakékoliv komentáře pod článkem.