Do-it-yourself Bare-Metal Provisioning alebo automatická príprava serverov od začiatku

Dobrý deň, volám sa Denis a jednou z oblastí mojej činnosti je vývoj infraštruktúrnych riešení v X5. Dnes by som sa s vami rád podelil o to, ako môžete nasadiť systém automatickej prípravy servera založený na verejne dostupných nástrojoch. Podľa mňa je to zaujímavé, jednoduché a flexibilné riešenie.

Do-it-yourself Bare-Metal Provisioning alebo automatická príprava serverov od začiatku

Pod prípravou máme na mysli: urobte z nového servera po vybalení plne nakonfigurovaný server s OS. Linux alebo s hypervízorom ESXi (nasadenie serverov Windows nie je diskutované v tomto článku).

Podmienky:

  • servery – servery, ktoré je potrebné nakonfigurovať.
  • inštalačný server je hlavný server, ktorý zabezpečuje celý proces prípravy cez sieť.

Prečo je potrebná automatizácia?

Povedzme, že existuje úloha: masívne pripraviť servery od nuly, maximálne - 30 za deň. Môžu byť na nich nainštalované servery rôznych výrobcov a modelov, rôzne operačné systémy a môžu alebo nemusia mať hypervízor.

Aké operácie sú zahrnuté v procese nastavenia (bez automatizácie):

  • pripojiť k serveru klávesnicu, myš, monitor;
  • konfigurovať BIOS, RAID, IPMI;
  • aktualizovať firmvér komponentov;
  • nasadiť obraz súborového systému (alebo nainštalovať hypervízor a kopírovať virtuálne stroje);

Poznámka. Alternatívne je nasadenie OS možné prostredníctvom inštalácie so súborom automatickej odpovede. Ale o tom nebude reč v článku. Aj keď nižšie uvidíte, že pridanie tejto funkcie nie je ťažké.

  • konfigurovať parametre OS (názov hostiteľa, IP atď.).

S týmto prístupom sa rovnaké nastavenia vykonajú postupne na každom serveri. Efektivita takejto práce je veľmi nízka.

Podstatou automatizácie je eliminovať ľudskú účasť v procese prípravy servera. Koľko to len pôjde.

Automatizácia znižuje prestoje medzi operáciami a umožňuje poskytovať viacero serverov súčasne. Pravdepodobnosť chýb spôsobených ľudským faktorom je tiež výrazne znížená.

Do-it-yourself Bare-Metal Provisioning alebo automatická príprava serverov od začiatku

Ako sa automaticky konfigurujú servery?

Poďme analyzovať všetky fázy podrobne.

Máte server Linux, ktorý používate ako inštalačný server PXE. Sú na ňom nainštalované a nakonfigurované služby: DHCP, TFTP.

Spustíme teda server (ktorý je potrebné nakonfigurovať) cez PXE. Pripomeňme si, ako to funguje:

  • Na serveri je vybraté spustenie siete.
  • Server načíta PXE-ROM sieťovej karty a kontaktuje inštalačný server cez DHCP, aby získal sieťovú adresu.
  • Inštalačný server DHCP vydá adresu, ako aj pokyny na ďalšie sťahovanie cez PXE.
  • Server načíta sieťový bootloader z inštalačného servera cez PXE, ďalšie načítanie prebieha podľa konfiguračného súboru PXE.
  • Zavedenie prebieha na základe prijatých parametrov (kernel, initramfs, body pripojenia, obraz squashfs atď.).

Poznámka. Článok popisuje bootovanie cez PXE cez režim BIOS. V súčasnosti výrobcovia aktívne implementujú bootmode UEFI. Pre PXE bude rozdiel v konfigurácii DHCP servera a prítomnosti dodatočného bootloadera.

Pozrime sa na príklad konfigurácie servera PXE (menu pxelinux).

Súbor 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 // переход на следующее меню

Súbor 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=”…”

Jadro a initramfs sú v tejto fáze prechodným obrazom Linuxu, pomocou ktorého prebehne hlavná príprava a konfigurácia servera.

Ako vidíte, bootloader odovzdáva jadru veľa parametrov. Niektoré z týchto parametrov používa samotné jadro. A niektoré môžeme použiť na vlastné účely. O tom sa bude diskutovať neskôr, ale zatiaľ si môžete pamätať, že všetky odovzdané parametre budú dostupné v prechodnom obraze Linuxu cez /proc/cmdline.

Kde ich môžem získať, jadro a initramfs?
Ako základ si môžete vybrať akúkoľvek distribúciu Linuxu. Na čo dbáme pri výbere:

  • zavádzací obraz musí byť univerzálny (dostupnosť ovládačov, možnosť inštalovať ďalšie pomôcky);
  • S najväčšou pravdepodobnosťou budete musieť prispôsobiť initramfs.

Ako sa to robí v našom riešení pre X5? Ako základ bol zvolený CentOS 7. Skúsme nasledujúci trik: pripravte si budúcu štruktúru image, zabaľte ju do archívu a vytvorte initramfs, v ktorom bude náš archív súborového systému. Pri načítaní obrazu sa archív rozbalí do vytvoreného oddielu tmpfs. Takto získame minimálny, no zároveň plnohodnotný živý linuxový obraz so všetkými potrebnými utilitami, pozostávajúci len z dvoch súborov: 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 sme teda jadro a initramfs, ktoré sa majú načítať. Výsledkom je, že v tejto fáze načítaním prechodného linuxového obrazu cez PXE dostaneme konzolu OS.

Skvelé, ale teraz musíme preniesť kontrolu na našu „automatizáciu“.

Dá sa to urobiť takto.

Predpokladajme, že po načítaní obrazu plánujeme preniesť riadenie do skriptu mount.sh.
Zahrňme skript mount.sh do autorun. Aby ste to dosiahli, budete musieť upraviť initramfs:

  • rozbaľte initramfs (ak použijeme vyššie uvedenú možnosť initramfs, nie je to potrebné)
  • zahrnúť do spustenia kód, ktorý bude analyzovať parametre prechádzajúce cez /proc/cmdline a ďalej prenášať riadenie;
  • balenie initramfs.

Poznámka. V prípade sady nástrojov X5 sa riadenie načítania prenáša do skriptu /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Načíta sa teda obrázok, v ktorom sa skript mount.sh spustí pri autorun. Ďalej skript mount.sh analyzuje odovzdané parametre (script_cmd=) počas vykonávania a spustí potrebný program/skript.

súprava nástrojov na štítky -auto
jadro...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

súprava nástrojov na štítky -škrupina
jadro...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Do-it-yourself Bare-Metal Provisioning alebo automatická príprava serverov od začiatku

Tu vľavo je ponuka PXE, vpravo schéma prenosu riadenia.

Vymysleli sme prenos kontroly. V závislosti od výberu ponuky PXE sa spustí buď skript automatickej konfigurácie alebo ladiaca konzola.

V prípade automatickej konfigurácie sú potrebné adresáre pripojené z inštalačného servera, ktoré obsahujú:

  • skripty;
  • uložené šablóny BIOS/UEFI pre rôzne servery;
  • firmvér;
  • serverové nástroje;
  • protokoly

Ďalej skript mount.sh prenesie riadenie do skriptu master-install.sh z adresára skriptu.

Strom skriptov (poradie, v akom sa spúšťajú) vyzerá asi takto:

  • master-install
  • sharefunctions (zdieľané funkcie)
  • info (výstup informácií)
  • modely (nastavenie parametrov inštalácie na základe modelu servera)
  • Prepare_utils (inštalácia potrebných nástrojov)
  • fwupdate (aktualizácia firmvéru)
  • diag (základná diagnostika)
  • biosconf (nastavenia BIOS/UEFI)
  • clockfix (nastavenie času na základnej doske)
  • srmconf (konfigurácia rozhrania vzdialeného rozhrania)
  • raidconf (konfigurácia logických zväzkov)

jeden z:

  • predinštalácia (prenos kontroly na inštalačný program operačného systému alebo hypervízora, ako je ESXi)
  • merged-install (okamžitý začiatok rozbaľovania obrazu)

Teraz vieme:

  • ako nabootovať server cez PXE;
  • ako preniesť kontrolu do vlastného skriptu.


Pokračujme. Nasledujúce otázky sa stali relevantnými:

  • Ako identifikovať server, ktorý pripravujeme?
  • Aké nástroje a ako nakonfigurovať server?
  • Ako získať nastavenia pre konkrétny server?

Ako identifikovať server, ktorý pripravujeme?

Je to jednoduché - DMI:

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

Všetko, čo potrebujete, je tu: predajca, model, sériové číslo. Ak si nie ste istí, či sú tieto informácie prítomné na všetkých serveroch, môžete ich identifikovať podľa ich MAC adresy. Alebo oboma spôsobmi súčasne, ak sú predajcovia serverov rôzni a na niektorých modeloch jednoducho neexistujú žiadne informácie o sériovom čísle.

Na základe prijatých informácií sú z inštalačného servera pripojené sieťové priečinky a načítané všetko potrebné (utility, firmvér atď.).

Aké nástroje a ako nakonfigurovať server?

Pre niektorých výrobcov poskytnem utility pre Linux. Všetky nástroje sú dostupné na oficiálnych stránkach predajcov.

Do-it-yourself Bare-Metal Provisioning alebo automatická príprava serverov od začiatku

S firmvérom je myslím všetko jasné. Zvyčajne prichádzajú vo forme balených spustiteľných súborov. Spustiteľný súbor riadi proces aktualizácie firmvéru a hlási návratový kód.

BIOS a IPMI sa zvyčajne konfigurujú prostredníctvom šablón. V prípade potreby je možné šablónu pred stiahnutím upraviť.

Pomôcky RAID od niektorých predajcov je možné nakonfigurovať aj pomocou šablóny. Ak to tak nie je, budete musieť napísať konfiguračný skript.

Postup nastavenia RAID je najčastejšie nasledovný:

  • Požadujeme aktuálnu konfiguráciu.
  • Ak už existujú logické polia, vymažeme ich.
  • Pozrime sa, aké fyzické disky sú prítomné a koľko ich je.
  • Vytvorte nové logické pole. V prípade chyby proces prerušíme.

Ako získať nastavenia pre konkrétny server?

Predpokladajme, že nastavenia všetkých serverov budú uložené na inštalačnom serveri. V tomto prípade, aby sme odpovedali na našu otázku, musíme sa najprv rozhodnúť, ako preniesť nastavenia na inštalačný server.

Najprv si vystačíte s textovými súbormi. (V budúcnosti možno budete chcieť použiť textový súbor ako záložnú metódu na prenos nastavení.)

Textový súbor môžete „zdieľať“ na inštalačnom serveri. A pridajte jeho pripojenie do skriptu mount.sh.

Riadky budú vyzerať napríklad takto:

<sériové číslo> <názov hostiteľa> <podsieť>

Tieto riadky prenesie do súboru strojník zo svojho pracovného stroja. A potom pri nastavovaní servera sa zo súboru načítajú parametre pre konkrétny server.

Z dlhodobého hľadiska je však lepšie používať databázu na ukladanie nastavení, stavov a protokolov serverových inštalácií.

Samozrejme, samotná databáza nestačí a bude potrebné vytvoriť klientsku časť, pomocou ktorej sa nastavenia prenesú do databázy. V porovnaní s textovým súborom je to náročnejšie na implementáciu, ale v skutočnosti nie je všetko také ťažké, ako sa zdá. Je celkom možné napísať minimálnu verziu klienta, ktorý jednoducho prenesie údaje do databázy sami. A v budúcnosti bude možné vylepšovať klientsky program vo voľnom režime (reportáže, tlač štítkov, posielanie notifikácií atď. čo vás napadne).

Zadaním špecifickej požiadavky do databázy a zadaním sériového čísla servera získame potrebné parametre pre konfiguráciu servera.

Navyše nebudeme musieť vymýšľať zámky pre simultánny prístup, ako je to v prípade textového súboru.

Konfiguračný protokol môžeme zapisovať do databázy vo všetkých fázach a kontrolovať proces inštalácie prostredníctvom udalostí a príznakov prípravných fáz.

Teraz vieme ako:

  • spustenie servera cez PXE;
  • preniesť riadenie do nášho skriptu;
  • identifikujte server, ktorý je potrebné pripraviť, podľa jeho sériového čísla;
  • nakonfigurovať server pomocou vhodných nástrojov;
  • preneste nastavenia do databázy inštalačného servera pomocou klientskej časti.

Zistili sme, ako:

  • nainštalovaný server prijíma potrebné nastavenia z databázy;
  • celý priebeh prípravy sa zaznamenáva do databázy (záznamy, udalosti, príznaky etapy).

A čo rôzne typy softvéru, ktorý inštalujete? Ako nainštalovať hypervízor, skopírovať VM a všetko nakonfigurovať?

V prípade nasadenia obrazu súborového systému (linux) na hardvér je všetko celkom jednoduché:

  • Po nastavení všetkých komponentov servera nasadíme obraz.
  • Nainštalujte zavádzač grub.
  • Chrootujeme a konfigurujeme všetko, čo je potrebné.

Ako preniesť ovládanie na inštalačný program OS (ako príklad použite ESXi).

  • Prenos kontroly z nášho skriptu do inštalačného programu hypervízora organizujeme pomocou súboru automatických odpovedí (kickstart):
  • Vymažeme aktuálne partície na disku.
  • Vytvorte oddiel s veľkosťou 500 MB.
  • Označujeme ho ako bootovateľný.
  • Formátovať na FAT32.
  • Skopírujeme inštalačné súbory ESXi do koreňového adresára.
  • Inštalácia syslinuxu.
  • Skopírujte súbor syslinux.cfg do /syslinux/

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

  • Skopírujte súbor mboot.c32 do /syslinux.
  • Boot.cfg by mal mať kernelopt=ks=ftp:// /ks_esxi.cfg
  • Reštartujeme server.

Po reštarte servera sa inštalačný program ESXi stiahne z pevného disku servera. Všetky potrebné inštalačné súbory sa načítajú do pamäte a potom sa začne inštalácia ESXi podľa zadaného súboru automatickej odpovede.

Tu je niekoľko riadkov zo súboru 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 tejto fáze sa nainštaluje a nakonfiguruje hypervízor a skopírujú sa virtuálne počítače.

Ako teraz nakonfigurovať virtuálne stroje?

Trochu sme podviedli: počas inštalácie sme v súbore VM1.vmx nastavili parameter guestinfo.esxihost.id = "$SYSSN" a uviedli v ňom sériové číslo fyzického servera.

Teraz, po spustení, môže virtuálny stroj (s nainštalovaným balíkom vmware-tools) pristupovať k tomuto parametru:

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

To znamená, že VM sa bude môcť identifikovať (pozná sériové číslo fyzického hostiteľa), odoslať požiadavku do databázy inštalačného servera a získať parametre, ktoré je potrebné nakonfigurovať. Toto všetko je skompilované do skriptu, ktorý by sa mal spustiť automaticky pri spustení guestos vm (ale raz: RunOnce).

Teraz vieme ako:

  • spustenie servera cez PXE;
  • preniesť riadenie do nášho skriptu;
  • identifikujte server, ktorý je potrebné pripraviť, podľa jeho sériového čísla;
  • nakonfigurovať server pomocou vhodných nástrojov;
  • preniesť nastavenia do databázy inštalačného servera pomocou klientskej časti;
  • konfigurovať rôzne typy softvéru vrátane nasadenia hypervízora esxi a konfigurácie virtuálnych strojov (všetko automaticky).

Zistili sme, ako:

  • nainštalovaný server prijíma potrebné nastavenia z databázy;
  • celý priebeh prípravy sa zaznamenáva do databázy (záznamy, udalosti, príznaky etapy).


Zrátané a podčiarknuté:

Verím, že jedinečnosť tohto riešenia spočíva v jeho flexibilite, jednoduchosti, schopnostiach a všestrannosti.

Napíšte do komentárov, čo si myslíte.

Zdroj: hab.com

Pridať komentár