Do-it-yourself Bare-Metal Provisioning neboli automatická příprava serverů od začátku

Dobrý den, jmenuji se Denis a jednou z mých oblastí činnosti je vývoj infrastrukturních řešení ve společnosti X5. Dnes bych se s vámi rád podělil o to, jak můžete nasadit systém automatické přípravy serverů založený na veřejně dostupných nástrojích. Dle mého názoru se jedná o zajímavé, jednoduché a flexibilní řešení.

Do-it-yourself Bare-Metal Provisioning neboli automatická příprava serverů od začátku

Přípravou máme na mysli: přeměnit nový server z krabice na plně nakonfigurovaný server s OS. Linux nebo s hypervisorem ESXi (nasazení serverů Windows není v tomto článku diskutováno).

Podmínky:

  • servery – servery, které je třeba nakonfigurovat.
  • instalační server je hlavní server, který zajišťuje celý proces přípravy přes síť.

Proč je potřeba automatizace?

Řekněme, že existuje úkol: masivně připravit servery od nuly, ve špičce – 30 denně. Mohou na nich být nainstalovány servery různých výrobců a modelů, různé operační systémy a mohou nebo nemusí mít hypervizor.

Jaké operace jsou zahrnuty v procesu nastavení (bez automatizace):

  • připojit klávesnici, myš, monitor k serveru;
  • konfigurovat BIOS, RAID, IPMI;
  • aktualizovat firmware komponent;
  • nasadit obraz systému souborů (nebo nainstalovat hypervizor a kopírovat virtuální stroje);

Poznámka. Alternativně je nasazení OS možné prostřednictvím instalace se souborem automatické odpovědi. O tom ale v článku řeč nebude. I když níže uvidíte, že přidání této funkce není obtížné.

  • konfigurovat parametry OS (název hostitele, IP atd.).

S tímto přístupem se na každém serveru postupně provádějí stejná nastavení. Efektivita takové práce je velmi nízká.

Podstatou automatizace je eliminovat lidskou účast v procesu přípravy serveru. Co nejvíc to půjde.

Automatizace snižuje prostoje mezi operacemi a umožňuje provozovat více serverů současně. Velmi se také snižuje pravděpodobnost chyb způsobených lidským faktorem.

Do-it-yourself Bare-Metal Provisioning neboli automatická příprava serverů od začátku

Jak se servery automaticky konfigurují?

Pojďme analyzovat všechny fáze podrobně.

Máte server Linux, který používáte jako instalační server PXE. Jsou na něm nainstalovány a konfigurovány služby: DHCP, TFTP.

Spustíme tedy server (který je potřeba nakonfigurovat) přes PXE. Připomeňme si, jak to funguje:

  • Na serveru je vybráno spouštění ze sítě.
  • Server načte PXE-ROM síťové karty a kontaktuje instalační server přes DHCP, aby získal síťovou adresu.
  • Instalační server DHCP vydá adresu a také pokyny pro další stahování přes PXE.
  • Server načte síťový bootloader z instalačního serveru přes PXE, další načítání probíhá podle konfiguračního souboru PXE.
  • Zavádění probíhá na základě přijatých parametrů (kernel, initramfs, přípojné body, obraz squashfs atd.).

Poznámka. Článek popisuje bootování přes PXE přes režim BIOS. V současné době výrobci aktivně implementují bootmode UEFI. U PXE bude rozdíl v konfiguraci DHCP serveru a přítomnosti dalšího bootloaderu.

Podívejme se na příklad konfigurace PXE serveru (menu pxelinux).

Soubor pxelinux.cfg/default:

default menu.c32
prompt 0
timeout 100
menu title X5 PXE Boot Menu
LABEL InstallServer Menu
	MENU LABEL InstallServer
	KERNEL menu.c32
	APPEND pxelinux.cfg/installserver
LABEL VMware Menu
	MENU LABEL VMware ESXi Install
	KERNEL menu.c32
	APPEND pxelinux.cfg/vmware
LABEL toolkit // меню по умолчанию
	MENU LABEL Linux Scripting Toolkits
	MENU default
	KERNEL menu.c32
	APPEND pxelinux.cfg/toolkit // переход на следующее меню

Soubor pxelinux.cfg/toolkit:

prompt 0
timeout 100
menu title X5 PXE Boot Menu
label mainmenu
    menu label ^Return to Main Menu
    kernel menu.c32
    append pxelinux.cfg/default
label x5toolkit-auto // по умолчанию — автоматический режим
        menu label x5 toolkit autoinstall
        menu default
        kernel toolkit/tkcustom-kernel
        append initrd=toolkit/tk-initramfs.gz quiet net.ifnames=0 biosdevname=0 nfs_toolkit_ip=192.168.200.1 nfs_toolkit_path=tftpboot/toolkit nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh CMDIS2=”…”
label x5toolkit-shell // для отладки - консоль
        menu label x5 toolkit shell
        kernel toolkit/tkcustom-kernel
        append initrd=toolkit/tkcustom-initramfs.gz quiet net.ifnames=0 biosdevname=0 nfs_toolkit_ip=192.168.200.1 nfs_toolkit_path=tftpboot/toolkit nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash CMDIS2=”…”

Jádro a initramfs jsou v této fázi přechodným obrazem Linuxu, s jehož pomocí bude probíhat hlavní příprava a konfigurace serveru.

Jak vidíte, bootloader předává jádru mnoho parametrů. Některé z těchto parametrů používá samotné jádro. A některé můžeme použít pro vlastní účely. O tom bude řeč později, ale prozatím si můžete jen pamatovat, že všechny předané parametry budou dostupné v přechodném obrazu Linuxu přes /proc/cmdline.

Kde je mohu získat, jádro a initramfs?
Jako základ si můžete vybrat jakoukoli distribuci Linuxu. Na co dbáme při výběru:

  • spouštěcí obraz musí být univerzální (dostupnost ovladačů, možnost instalovat další nástroje);
  • S největší pravděpodobností budete muset upravit initramfs.

Jak se to dělá v našem řešení pro X5? Jako základ byl zvolen CentOS 7. Zkusme následující trik: připravit budoucí image strukturu, zabalit ji do archivu a vytvořit initramfs, uvnitř kterého bude náš archiv souborového systému. Při načítání obrazu se archiv rozbalí do vytvořeného oddílu tmpfs. Získáme tak minimální, přesto plnohodnotný živý linuxový obraz se všemi potřebnými utilitami, skládající se pouze ze dvou souborů: vmkernel a initramfs.

#создаем директории: 

mkdir -p /tftpboot/toolkit/CustomTK/rootfs /tftpboot/toolkit/CustomTK/initramfs/bin

#подготавливаем структуру:

yum groups -y install "Minimal Install" --installroot=/tftpboot/toolkit/CustomTK/rootfs/
yum -y install nfs-utils mariadb ntpdate mtools syslinux mdadm tbb libgomp efibootmgr dosfstools net-tools pciutils openssl make ipmitool OpenIPMI-modalias rng-tools --installroot=/tftpboot/toolkit/CustomTK/rootfs/
yum -y remove biosdevname --installroot=/tftpboot/toolkit/CustomTK/rootfs/

# подготавливаем initramfs:

wget https://busybox.net/downloads/binaries/1.31.0-defconfig-multiarch-musl/busybox-x86_64 -O /tftpboot/toolkit/CustomTK/initramfs/bin/busybox
chmod a+x /tftpboot/toolkit/CustomTK/initramfs/bin/busybox
cp /tftpboot/toolkit/CustomTK/rootfs/boot/vmlinuz-3.10.0-957.el7.x86_64 /tftpboot/toolkit/tkcustom-kernel

# создаем /tftpboot/toolkit/CustomTK/initramfs/init (ниже содержание скрипта):

#!/bin/busybox sh
/bin/busybox --install /bin
mkdir -p /dev /proc /sys /var/run /newroot
mount -t proc proc /proc
mount -o mode=0755 -t devtmpfs devtmpfs /dev
mkdir -p /dev/pts /dev/shm /dev/mapper /dev/vc
mount -t devpts -o gid=5,mode=620 devpts /dev/pts
mount -t sysfs sysfs /sys
mount -t tmpfs -o size=4000m tmpfs /newroot
echo -n "Extracting rootfs... "
xz -d -c -f rootfs.tar.xz | tar -x -f - -C /newroot
echo "done"
mkdir -p /newroot/dev /newroot/proc /newroot/sys
mount --move /sys  /newroot/sys
mount --move /proc /newroot/proc
mount --move /dev  /newroot/dev
exec switch_root /newroot /sbin/init

# упаковываем rootfs и initramfs:

cd /tftpboot/toolkit/CustomTK/rootfs
tar cJf /tftpboot/toolkit/CustomTK/initramfs/rootfs.tar.xz --exclude ./proc --exclude ./sys --exclude ./dev .
cd /tftpboot/toolkit/CustomTK/initramfs
find . -print0 | cpio --null -ov --format=newc | gzip -9 > /tftpboot/toolkit/tkcustom-initramfs-new.gz

Zadali jsme tedy jádro a initramfs, které by se měly načíst. Výsledkem je, že v této fázi načtením přechodného linuxového obrazu přes PXE obdržíme konzolu OS.

Skvělé, ale nyní musíme přenést kontrolu na naši „automatizaci“.

Dá se to udělat takto.

Předpokládejme, že po načtení obrázku plánujeme předat řízení skriptu mount.sh.
Zahrneme skript mount.sh do automatického spouštění. K tomu budete muset upravit initramfs:

  • rozbalte initramfs (pokud použijeme výše uvedenou možnost initramfs, není to nutné)
  • zahrnout do spuštění kód, který bude analyzovat parametry předávané přes /proc/cmdline a dále přenášet řízení;
  • balení initramfs.

Poznámka. V případě sady nástrojů X5 je řízení načítání přeneseno do skriptu /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Načte se tedy obraz, ve kterém se skript mount.sh spustí při autorun. Dále skript mount.sh analyzuje předané parametry (script_cmd=) během provádění a spustí potřebný program/skript.

sada nástrojů pro štítky -auto
jádro...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

sada nástrojů pro štítky -skořápka
jádro...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Do-it-yourself Bare-Metal Provisioning neboli automatická příprava serverů od začátku

Zde vlevo je nabídka PXE, vpravo schéma přenosu řízení.

Vymysleli jsme předání řízení. V závislosti na volbě nabídky PXE se spustí buď skript automatické konfigurace, nebo ladicí konzole.

V případě automatické konfigurace jsou potřebné adresáře připojeny z instalačního serveru, které obsahují:

  • skripty;
  • uložené šablony BIOS/UEFI pro různé servery;
  • firmware;
  • serverové nástroje;
  • protokoly

Dále skript mount.sh předá řízení skriptu master-install.sh z adresáře skriptu.

Strom skriptů (pořadí, ve kterém jsou spouštěny) vypadá asi takto:

  • hlavní instalace
  • sharefunctions (sdílené funkce)
  • info (výstup informací)
  • modely (nastavení parametrů instalace na základě modelu serveru)
  • Prepare_utils (instalace potřebných nástrojů)
  • fwupdate (aktualizace firmwaru)
  • diag (základní diagnostika)
  • biosconf (nastavení BIOS/UEFI)
  • clockfix (nastavení času na základní desce)
  • srmconf (konfigurace rozhraní vzdáleného rozhraní)
  • raidconf (konfigurace logických svazků)

jeden z:

  • předinstalace (přenesení kontroly na instalační program operačního systému nebo hypervizoru, jako je ESXi)
  • merged-install (okamžité zahájení rozbalování obrazu)

Nyní víme:

  • jak nabootovat server přes PXE;
  • jak přenést ovládání do vlastního skriptu.


Pokračujme. Následující otázky se staly relevantními:

  • Jak identifikovat server, který připravujeme?
  • Jaké nástroje a jak nakonfigurovat server?
  • Jak získat nastavení pro konkrétní server?

Jak identifikovat server, který připravujeme?

Je to jednoduché - DMI:

dmidecode –s system-product-name
dmidecode –s system-manufacturer
dmidecode –s system-serial-number

Vše, co potřebujete, je zde: prodejce, model, sériové číslo. Pokud si nejste jisti, že jsou tyto informace přítomny na všech serverech, můžete je identifikovat podle jejich MAC adresy. Nebo oběma způsoby současně, pokud jsou prodejci serverů různí a na některých modelech prostě nejsou žádné informace o sériovém čísle.

Na základě obdržených informací se z instalačního serveru připojí síťové složky a nahraje se vše potřebné (utility, firmware atd.).

Jaké nástroje a jak nakonfigurovat server?

Pro některé výrobce dodám utility pro Linux. Všechny nástroje jsou dostupné na oficiálních stránkách prodejců.

Do-it-yourself Bare-Metal Provisioning neboli automatická příprava serverů od začátku

S firmwarem je myslím vše jasné. Obvykle přicházejí ve formě zabalených spustitelných souborů. Spustitelný soubor řídí proces aktualizace firmwaru a hlásí návratový kód.

BIOS a IPMI se obvykle konfigurují pomocí šablon. V případě potřeby lze šablonu před stažením upravit.

Nástroje RAID od některých výrobců lze také nakonfigurovat pomocí šablony. Pokud tomu tak není, budete muset napsat konfigurační skript.

Postup nastavení RAID je nejčastěji následující:

  • Požadujeme aktuální konfiguraci.
  • Pokud již existují logická pole, vymažeme je.
  • Podívejme se, jaké fyzické disky jsou k dispozici a kolik jich je.
  • Vytvořte nové logické pole. V případě chyby proces přerušíme.

Jak získat nastavení pro konkrétní server?

Předpokládejme, že nastavení všech serverů bude uloženo na instalačním serveru. V tomto případě, abychom odpověděli na naši otázku, musíme nejprve rozhodnout, jak přenést nastavení na instalační server.

Nejprve si vystačíte s textovými soubory. (V budoucnu možná budete chtít použít textový soubor jako záložní metodu pro přenos nastavení.)

Textový soubor můžete „sdílet“ na instalačním serveru. A přidejte jeho připojení do skriptu mount.sh.

Řádky budou vypadat například takto:

<sériové číslo> <název hostitele> <podsíť>

Tyto řádky přenese do souboru strojník ze svého pracovního stroje. A pak při nastavování serveru se ze souboru načtou parametry pro konkrétní server.

Z dlouhodobého hlediska je však lepší používat databázi pro ukládání nastavení, stavů a ​​protokolů instalací serveru.

Samotná databáze samozřejmě nestačí a bude potřeba vytvořit klientskou část, pomocí které se nastavení přenesou do databáze. To je ve srovnání s textovým souborem obtížněji implementovatelné, ale ve skutečnosti není vše tak obtížné, jak se zdá. Je docela možné napsat minimální verzi klienta, která jednoduše přenese data do databáze sami. A v budoucnu bude možné vylepšovat klientský program ve volném režimu (přehledy, tisk štítků, zasílání upozornění atd. co vás napadne).

Zadáním specifického požadavku na databázi a zadáním sériového čísla serveru obdržíme potřebné parametry pro konfiguraci serveru.

Navíc nebudeme muset vymýšlet zámky pro simultánní přístup, jako je tomu u textového souboru.

Konfigurační protokol můžeme zapisovat do databáze ve všech fázích a řídit proces instalace prostřednictvím událostí a příznaků přípravných fází.

Nyní víme jak:

  • nabootovat server přes PXE;
  • přenést řízení do našeho skriptu;
  • identifikovat server, který je třeba připravit, podle jeho sériového čísla;
  • nakonfigurujte server pomocí příslušných nástrojů;
  • přenést nastavení do databáze instalačního serveru pomocí klientské části.

Zjistili jsme, jak:

  • nainstalovaný server obdrží potřebná nastavení z databáze;
  • veškerý postup přípravy je zaznamenáván do databáze (protokoly, události, příznaky etap).

A co různé typy softwaru, který instalujete? Jak nainstalovat hypervizor, zkopírovat virtuální počítač a vše nakonfigurovat?

V případě nasazení obrazu systému souborů (linux) na hardware je vše docela jednoduché:

  • Po nastavení všech serverových komponent nasadíme image.
  • Nainstalujte zavaděč grub.
  • Chrootujeme a nakonfigurujeme vše, co je potřeba.

Jak přenést ovládání na instalační program OS (jako příklad použijte ESXi).

  • Organizujeme přenos řízení z našeho skriptu do instalačního programu hypervisoru pomocí souboru automatických odpovědí (kickstart):
  • Vymažeme aktuální oddíly na disku.
  • Vytvořte oddíl o velikosti 500 MB.
  • Označíme jej jako bootovatelný.
  • Formátovat na FAT32.
  • Instalační soubory ESXi zkopírujeme do kořenového adresáře.
  • Instalace syslinuxu.
  • Zkopírujte syslinux.cfg do /syslinux/

default esxi
prompt 1
timeout 50
label esxi
kernel mboot.c32
append -c boot.cfg

  • Zkopírujte soubor mboot.c32 do /syslinux.
  • Boot.cfg by měl mít kernelopt=ks=ftp:// /ks_esxi.cfg
  • Restartujte server.

Po restartování serveru se instalační program ESXi stáhne z pevného disku serveru. Všechny potřebné instalační soubory budou načteny do paměti a poté začne instalace ESXi podle zadaného souboru automatické odpovědi.

Zde je několik řádků ze souboru autoresponse ks_esxi.cfg:

%firstboot --interpreter=busybox
…
# получаем серийный номер

SYSSN=$(esxcli hardware platform get | grep Serial | awk -F " " '{print $3}')

# получаем IP

IPADDRT=$(esxcli network ip interface ipv4 get | grep vmk0 | awk -F " " '{print $2}')
LAST_OCTET=$(echo $IPADDRT | awk -F'.' '{print $4}')

# подключаем NFS инсталл-сервера

esxcli storage nfs add -H is -s /srv/nfs_share -v nfsshare1

# копируем временные настройки ssh, для использования ssh-клиента

mv /etc/ssh /etc/ssh.tmp
cp -R /vmfs/volumes/nfsshare1/ssh /etc/
chmod go-r /etc/ssh/ssh_host_rsa_key

# копируем ovftool, для развертывания ВМ сейчас, плюс возможно пригодится позже

cp -R /vmfs/volumes/nfsshare1/ovftool /vmfs/volumes/datastore1/

# развертываем ВМ

/vmfs/volumes/datastore1/ovftool/tools/ovftool --acceptAllEulas --noSSLVerify --datastore=datastore1 --name=VM1 /vmfs/volumes/nfsshare1/VM_T/VM1.ova vi://root:[email protected]
/vmfs/volumes/datastore1/ovftool/tools/ovftool --acceptAllEulas --noSSLVerify --datastore=datastore1 --name=VM2 /vmfs/volumes/nfsshare1/VM_T/VM2.ova vi://root:[email protected]

# получаем строку с настройками нашего сервера

ssh root@is "mysql -h'192.168.0.1' -D'servers' -u'user' -p'secretpassword' -e "SELECT ... WHERE servers.serial='$SYSSN'"" | grep -v ^$ | sed 's/NULL//g' > /tmp/servers
...
# генерируем скрипт настройки сети

echo '#!/bin/sh' > /vmfs/volumes/datastore1/netconf.sh
echo "esxcli network ip interface ipv4 set -i=vmk0 -t=static --ipv4=$IPADDR --netmask=$S_SUB || exit 1" >> /vmfs/volumes/datastore1/netconf.sh
echo "esxcli network ip route ipv4 add -g=$S_GW -n=default || exit 1" >> /vmfs/volumes/datastore1/netconf.sh
chmod a+x /vmfs/volumes/datastore1/netconf.sh

# задаем параметр guestinfo.esxihost.id, указываем в нем серийный номер

echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM1/VM1.vmx
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM2/VM2.vmx
...
# обновляем информацию в базе

SYSNAME=$(esxcli hardware platform get | grep Product | sed 's/Product Name://' | sed 's/^ *//')
UUID=$(vim-cmd hostsvc/hostsummary | grep uuid | sed 's/ //g;s/,$//' | sed 's/^uuid="//;s/"$//')
ssh root@is "mysql -D'servers' -u'user' -p'secretpassword' -e "UPDATE servers ... SET ... WHERE servers.serial='$SYSSN'""
ssh root@is "mysql -D'servers' -u'user' -p'secretpassword' -e "INSERT INTO events ...""

# возвращаем настройки SSH

rm -rf /etc/ssh
mv /etc/ssh.tmp /etc/ssh

# настраиваем сеть и перезагружаемся

esxcli system hostname set --fqdn=esx-${G_NICK}.x5.ru
/vmfs/volumes/datastore1/netconf.sh
reboot

V této fázi je nainstalován a konfigurován hypervizor a zkopírovány virtuální stroje.

Jak nyní nakonfigurovat virtuální stroje?

Trochu jsme podvedli: při instalaci jsme v souboru VM1.vmx nastavili parametr guestinfo.esxihost.id = "$SYSSN" a uvedli v něm sériové číslo fyzického serveru.

Nyní, po spuštění, má virtuální stroj (s nainstalovaným balíčkem vmware-tools) přístup k tomuto parametru:

ESXI_SN=$(vmtoolsd --cmd "info-get guestinfo.esxihost.id")

To znamená, že virtuální počítač se bude moci identifikovat (zná sériové číslo fyzického hostitele), zadá požadavek na databázi instalačního serveru a obdrží parametry, které je třeba nakonfigurovat. To vše je zkompilováno do skriptu, který by měl být spuštěn automaticky při spuštění guestos vm (ale jednou: RunOnce).

Nyní víme jak:

  • nabootovat server přes PXE;
  • přenést řízení do našeho skriptu;
  • identifikovat server, který je třeba připravit, podle jeho sériového čísla;
  • nakonfigurujte server pomocí příslušných nástrojů;
  • přenést nastavení do databáze instalačního serveru pomocí klientské části;
  • konfigurovat různé typy softwaru, včetně nasazení hypervizoru esxi a konfigurace virtuálních strojů (vše automaticky).

Zjistili jsme, jak:

  • nainstalovaný server obdrží potřebná nastavení z databáze;
  • veškerý postup přípravy je zaznamenáván do databáze (protokoly, události, příznaky etap).


Sečteno a podtrženo:

Věřím, že jedinečnost tohoto řešení spočívá v jeho flexibilitě, jednoduchosti, možnostech a univerzálnosti.

Napište prosím do komentářů, co si myslíte.

Zdroj: www.habr.com

Přidat komentář