Bare-Metal Provisioning svojpomocne, alebo Automatická príprava serverov od základov

Ahoj, volám sa Denis a jedným z mojich pracovných zameraní je vývoj infraštruktúrnych riešení v X5. Dnes by som sa s vami rád podelil o to, ako je možné pomocou verejných nástrojov nasadiť automatizovaný systém na prípravu serverov. Podľa môjho názoru je to zaujímavé, jednoduché a flexibilné riešenie.

Bare-Metal Provisioning svojpomocne, alebo Automatická príprava serverov od základov

Prípravou sa rozumie: urobiť z nového servera priamo z krabice, plne nastavený server s operačným systémom Linux alebo s hypervízorom ESXi (nasadenie serverov Windows v tomto článku nie je diskutované).

Termíny:

  • servery – servery, ktoré je potrebné nastaviť.
  • inštal-servery – hlavné servery, ktoré zabezpečujú celý proces prípravy prostredníctvom siete.

Prečo je potrebná automatizácia?

Predpokladajme, že existuje úloha: masovo pripravovať servery od nuly, v špičke – 30 za deň. Servery rôznych výrobcov a modelov, na ktoré môžu byť nainštalované rôzne operačné systémy, pričom hypervízor môže byť prítomný alebo neprítomný.

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

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

Poznámka. Ako variant, nasadenie OS je možné cez inštaláciu s súborom autoodpovedí. Ale to nebude v článku prediskutované. Aj keď nižšie uvidíte, že pridať túto funkciu nie je zložité.

  • nastaviť parametre OS (hostname, IP atď.).

Pri tomto prístupe sa vykonávajú rovnaké nastavenia postupne na každom serveri. Efektívnosť takejto práce je veľmi nízka.

Podstata automatizácie spočíva v vylúčení účasti človeka z procesu prípravy servera. Maximálne, ako je to možné.

Vďaka automatizácii sa skracuje čas nečinnosti medzi operáciami a vzniká možnosť pripraviť niekoľko serverov súčasne. Takisto sa výrazne znižuje pravdepodobnosť vzniku chýb spôsobených ľudským faktorom.

Bare-Metal Provisioning svojpomocne, alebo Automatická príprava serverov od základov

Ako prebieha automatické nastavenie serverov?

Rozoberieme všetky etapy podrobne.

Máte linux-server, ktorý používate ako PXE inštal-server. Na ňom sú nainštalované a nastavené služby: DHCP, TFTP.

Takže, načítame server (ktorý je potrebné nastaviť) cez PXE. Pripomeňme si, ako to funguje:

  • Na serveri je vybrané spustenie cez sieť.
  • Server loads the PXE-ROM of the network card and contacts the installation server via DHCP to obtain a network address.
  • The DHCP of the installation server issues an address and also gives instructions for further loading via PXE.
  • The server loads the network bootloader from the installation server via PXE, and further loading occurs according to the PXE configuration file.
  • The loading occurs based on the received parameters (kernel, initramfs, mount points, squashfs image, etc.).

Note. This article describes PXE booting via BIOS mode. Currently, manufacturers are actively implementing UEFI boot mode. The difference for PXE will lie in the configuration of the DHCP server and the presence of an additional bootloader.

Let's consider an example configuration of a PXE server (pxelinux menu).

File 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 // default menu
	MENU LABEL Linux Scripting Toolkits
	MENU default
	KERNEL menu.c32
	APPEND pxelinux.cfg/toolkit // transition to the next menu

File 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 // default — automatic mode
        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 // for debugging - console
        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="…"

At this stage, the kernel and initramfs are an intermediate Linux image, which will be used for the main preparation and configuration of the server.

As you can see, the bootloader passes many parameters to the kernel. Some of these parameters are used by the kernel itself, while others can be utilized for our purposes. This will be discussed further, but for now, just remember that all passed parameters will be accessible in the intermediate Linux image via /proc/cmdline.

Where to get them, the kernel and initramfs?
You can choose any Linux distribution as the basis. What to pay attention to when choosing:

  • the boot image must be universal (availability of drivers, ability to install additional utilities);
  • pravdepodobne bude potrebné prispôsobiť initramfs.

Ako je to implementované v našom riešení pre X5? Ako základ sme zvolili CentOS 7. Urobíme nasledujúci trik: pripravíme budúcu štruktúru obrazu, zabalíme ju do archívu a vytvoríme initramfs, v ktorom bude náš archív súborového systému. Pri načítaní obrazu sa archív rozbalí do vytváraného oddielu tmpfs. Týmto spôsobom získame minimálny, ale plnohodnotný live obraz linuxu so všetkými potrebnými utilitami, pozostávajúci 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

Takže sme zadali kernel a initramfs, ktoré by mali byť načítané. Výsledkom v tomto kroku, po načítaní medzného obrazu linuxu cez PXE, získame konzolu OS.

Skvelé, ale teraz musíme odovzdať riadenie našej „automatizácii“.

To môžeme urobiť takto.

Predpokladajme, že po načítaní obrazu plánujeme odovzdať riadenie skriptu mount.sh.
Zahrnieme skript mount.sh do automatického spúšťania. Na to bude potrebné modifikovať initramfs:

  • rozbaliť initramfs (ak používame vyššie uvedenú verziu initramfs, to nie je potrebné)
  • zahrnúť do automatického spúšťania kód, ktorý bude analyzovať odovzdávané parametre cez /proc/cmdline a odovzdávať riadenie ďalej;
  • zabaliť initramfs.

Poznámka. V prípade toolkit X5 sa riadenie spúšťania odovzdáva do skriptu /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Takže sa načíta obraz, v ktorom sa v automatickom spúšťaní spúšťa skript mount.sh. Potom skript mount.sh počas vykonávania analyzuje odovzdané parametre (script_cmd=) a spúšťa potrebný program/skript.

label toolkit-auto
kernel …
append … nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

label toolkit-shell
kernel …
append … nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Bare-Metal Provisioning svojpomocne, alebo Automatická príprava serverov od základov

Tu na ľavej strane je menu PXE, na pravej – schéma odovzdávania riadenia.

S odovzdávaním riadenia sme sa vysporiadali. V závislosti od výberu PXE-menu sa spúšťa buď skript automatickej konfigurácie, alebo konzola na ladenie.

Pri automatickej konfigurácii sa montujú potrebné adresáre z inštalačného servera, v ktorých sa nachádzajú:

  • skripty;
  • uložené šablóny BIOS/UEFI rôznych serverov;
  • firmware;
  • utility pre servery;
  • logy.

Potom skript mount.sh odovzdáva riadenie skriptu master-install.sh z adresára so skriptami.

Štruktúra skriptov (poradie ich spúšťania) vyzerá asi takto:

  • master-install
  • sharefunctions (spoločné funkcie)
  • info (výstup informácií)
  • models (nastavenie parametrov inštalácie na základe modelu servera)
  • prepare_utils (inštalácia potrebných utilít)
  • fwupdate (aktualizácia firmvéru)
  • diag (základná diagnostika)
  • biosconf (konfigurácia BIOSu/UEFI)
  • clockfix (nastavenie času na základnej doske)
  • srmconf (nastavenie rozhrania vzdialeného prístupu)
  • raidconf (konfigurácia logických zväzkov)

jedna z:

  • preinstall (odovzdanie kontroly inštalátorovi OS alebo hypervízora, napr. ESXi)
  • merged-install (priamy štart extrakcie obrazu)

Teraz vieme:

  • ako bootovať server cez PXE;
  • ako odovzdať kontrolu do vlastného skriptu.


Pokračujme. Stali sa aktuálne nasledujúce otázky:

  • Ako identifikovať server, ktorý pripravujeme?
  • Aké nástroje a ako konfigurovať 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

Tu sú všetky potrebné informácie: výrobca, model, sériové číslo. Ak si nie ste istí, že sú tieto informácie dostupné vo všetkých serveroch, môžete ich identifikovať podľa MAC adresy. Alebo oboma spôsobmi zároveň, ak sú servery od rôznych výrobcov a na niektorých modeloch môže informácia o sériovom čísle úplne chýbať.

Na základe získaných informácií sú pripojené sieťové zdieľania z inštalačného servera a načítavajú sa všetky potrebné (nástroje, firmvéry a iné).

Aké nástroje a ako konfigurovať server?

Uvediem nástroje pre linux od niektorých výrobcov. Všetky nástroje sú dostupné na oficiálnych stránkach výrobcov.

Bare-Metal Provisioning svojpomocne, alebo Automatická príprava serverov od základov

S firmvérmi, myslím, je všetko jasné. Zvyčajne sa dodávajú vo forme zabalených spustiteľných súborov. Spustiteľný súbor ovláda proces aktualizácie firmvéru a hlási návratový kód.

BIOS a IPMI sa zvyčajne konfiguroval cez šablóny. Ak je to potrebné, šablónu je možné upraviť tesne pred spustením.

Nástroje RAID niektorých výrobcov tiež môžu byť nakonfigurované pomocou šablóny. Ak to nie je možné, bude potrebné napísať skript na konfiguráciu.

Poradie nastavenia RAID je najčastejšie nasledujúce:

  • Požiadame o aktuálnu konfiguráciu.
  • Ak už existujú logické polia – vymažeme ich.
  • Pozrieme sa, aké fyzické disky sú prítomné a koľko ich je.
  • Vytvoríme nové logické pole. Proces prerušíme v prípade chyby.

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

Predpokladajme, že nastavenia všetkých serverov budú uložené na inštalačnom serveri. V takom prípade, aby sme odpovedali na našu otázku, musíme najprv rozhodnúť, akým spôsobom budeme odovzdávať nastavenia na inštalačný server.

Na začiatku je celkom možné vystačiť si s textovými súbormi. (V budúcnosti je možné použiť textový súbor ako záložný spôsob prenosu nastavení).

Môžete „zdielať“ textový súbor na inštalačnom serveri. A pridať jeho pripojenie do skriptu mount.sh.

Riadky budú napríklad takéto:

Tieto riadky budú prenášané do súboru inžinierom z jeho pracovného počítača. A potom, pri nastavovaní servera, budú parametre pre konkrétny server prečítané zo súboru.

Ale z dlhodobého hľadiska je lepšie využiť DB na uchovávanie nastavení, stavov a záznamov inštalácií serverov.

Samozrejme, s jednou DB sa neobídeme, a bude potrebné vytvoriť klientskú časť, pomocou ktorej sa budú prenášať nastavenia do databázy. Realizovať to je náročnejšie než s textovým súborom, ale v skutočnosti to nie je také ťažké, ako sa zdá. Minimálnu verziu klienta, ktorá jednoducho prenáša údaje do DB, je celkom možné napísať aj sám. A v budúcnosti sa dá zlepšiť klientský program vo voľnom režime (správy, tlač štítkov, odosielanie upozornení a iné, čo napadne).

Po vykonaní určeného dotazu v databáze a uvedení sériového čísla servera dostaneme požadované parametre na nastavenie servera.

Navyše, nepotrebujeme vymýšľať blokácie pre súbežný prístup, ako v prípade s textovým súborom.

Záznamy o nastavení môžeme na všetkých fázach zapisovať do DB a proces inštalácie môžeme kontrolovať prostredníctvom udalostí a vlajok fáz prípravy.

Teraz vieme, ako:

  • načítať server cez PXE;
  • preniesť riadenie nášmu skriptu;
  • identifikovať server, ktorý je potrebné pripraviť, podľa sériového čísla;
  • konfigurovať server pomocou príslušných nástrojov;
  • prenášať nastavenia do DB inštalačného servera pomocou klientskej časti.

Zistili sme, akým spôsobom:

  • inštalovaný server získava potrebné nastavenia z DB;
  • celý pokrok prípravy sa zaznamenáva v DB (logy, udalosti, vlajky fáz).

Čo sa týka rôznych typov inštalovaného SW? Ako nainštalovať hypervízor, skopírovať VM a nastaviť všetko toto?

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

  • Po nastavení všetkých komponentov servera rozmiestnime obraz.
  • Nainštalujeme zavádzač grub.
  • Robíme chroot a nastavujeme všetko, čo potrebujeme.

Ako odovzdať riadenie inštalátorovi OS (na príklade ESXi).

  • Organizujeme odovzdanie riadenia z nášho skriptu inštalátorovi hypervízora prostredníctvom súboru s automatickými odpoveďami (kickstart):
  • Odstraňujeme aktuálne oddiely na disku.
  • Vytvárame oddiel s veľkosťou 500MB.
  • Označujeme ho ako spúšťací.
  • Formátujeme ho na FAT32.
  • Kopírujeme naň do koreňového adresára inštalačné súbory ESXi.
  • Inštalujeme syslinux.
  • Kopírujeme syslinux.cfg do /syslinux/

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

  • Kopírujeme mboot.c32 do /syslinux.
  • V boot.cfg by malo byť kernelopt=ks=ftp:///ks_esxi.cfg
  • Reštartujeme server.

Po reštarte servera sa z jeho pevného disku spustí inštalátor ESXi. Všetky potrebné súbory inštalátora sa načítajú do pamäte a následne začne inštalácia ESXi podľa uvedeného súboru s automatickými odpoveďami.

Uvediem sem niekoľko riadkov zo súboru s automatickými odpoveďami ks_esxi.cfg:

%firstboot --interpreter=busybox
…
# získať sériové číslo

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

# získať IP

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

# pripojenie NFS inštalačného servera

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

# kopírovanie dočasných nastavení ssh na použitie ssh klienta

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

# kopírovanie ovftool na nasadenie VM teraz, môže sa hodiť aj neskôr

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

# nasadenie VM

/vmfs/volumes/datastore1/ovftool/tools/ovftool --acceptAllEulas --noSSLVerify --datastore=datastore1 --name=VM1 /vmfs/volumes/nfsshare1/VM_T/VM1.ova vi://root:esxi_password@127.0.0.1
/vmfs/volumes/datastore1/ovftool/tools/ovftool --acceptAllEulas --noSSLVerify --datastore=datastore1 --name=VM2 /vmfs/volumes/nfsshare1/VM_T/VM2.ova vi://root:esxi_password@127.0.0.1

# získanie riadku s nastaveniami nášho servera

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
...
# generovanie skriptu na nastavenie siete

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

# nastavíme parameter guestinfo.esxihost.id, uvedieme v ňom sériové číslo

echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM1/VM1.vmx
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM2/VM2.vmx
...
# aktualizujeme informácie v databáze

SYSNAME=$(esxcli hardware platform get | grep Product | sed 's/Product Name://;s/^ *//')
UUID=$(vim-cmd hostsvc/hostsummary | grep uuid | sed 's/ //g;s/,$//;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 ...""

# vrátíme nastavenia SSH

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

# nastavíme sieť a reštartujeme

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

V tomto štádiu je hypervízor nainštalovaný a nastavený, virtuálne stroje sú skopírované.

Ako teraz nastaviť virtuálne stroje?

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

Teraz, po štarte virtuálneho stroja (s nainštalovaným balíkom vmware-tools), sa môže k tomuto parametru dostať:

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

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

Teraz vieme, ako:

  • načítať server cez PXE;
  • preniesť riadenie nášmu skriptu;
  • identifikovať server, ktorý je potrebné pripraviť, podľa sériového čísla;
  • konfigurovať server pomocou príslušných utilít;
  • prenášať 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 nastavenia virtuálnych strojov (a všetko automaticky).

Zistili sme, akým spôsobom:

  • inštalovaný server získava potrebné nastavenia z DB;
  • celý pokrok prípravy sa zaznamenáva v DB (logy, udalosti, vlajky fáz).


Záver:

Myslím, že jedinečnosť tohto riešenia spočíva v flexibilite, jednoduchej použití a jeho možnostiach a univerzálnosti.

Prosím, napíšte vo komentároch, čo si myslíte.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster