Do-it-yourself Bare-Metal Provisioning ili automatska priprema poslužitelja od nule

Pozdrav, ja sam Denis i jedno od mojih područja djelovanja je razvoj infrastrukturnih rješenja u X5. Danas bih želio s vama podijeliti kako možete implementirati sustav za automatsku pripremu poslužitelja koji se temelji na javno dostupnim alatima. Po mom mišljenju, ovo je zanimljivo, jednostavno i fleksibilno rješenje.

Do-it-yourself Bare-Metal Provisioning ili automatska priprema poslužitelja od nule

Pod pripremom mislimo: pretvorite novi poslužitelj iz kutije u potpuno konfigurirani poslužitelj s OS-om. Linux ili s ESXi hipervizorom (uvođenje Windows poslužitelja nije objašnjeno u ovom članku).

uvjeti:

  • poslužitelji – poslužitelji koje je potrebno konfigurirati.
  • instalacijski poslužitelj je glavni poslužitelj koji omogućuje cijeli proces pripreme preko mreže.

Zašto je potrebna automatizacija?

Recimo da postoji zadatak: masovno pripremiti poslužitelje od nule, na vrhuncu - 30 dnevno. Na njima mogu biti instalirani poslužitelji različitih proizvođača i modela, različiti operativni sustavi, a mogu i ne moraju imati hipervizor.

Koje su operacije uključene u proces postavljanja (bez automatizacije):

  • spojite tipkovnicu, miš, monitor na poslužitelj;
  • konfigurirati BIOS, RAID, IPMI;
  • ažuriranje firmvera komponente;
  • postavite sliku datotečnog sustava (ili instalirajte hipervizor i kopirajte virtualne strojeve);

Bilješka. Alternativno, implementacija OS-a moguća je instalacijom s datotekom automatskog odgovora. Ali o tome se neće raspravljati u članku. Iako ćete u nastavku vidjeti da dodavanje ove funkcije nije teško.

  • konfigurirajte parametre OS-a (naziv glavnog računala, IP itd.).

S ovim pristupom, iste postavke se izvode sekvencijalno na svakom poslužitelju. Učinkovitost takvog rada je vrlo niska.

Bit automatizacije je eliminirati ljudsko sudjelovanje u procesu pripreme poslužitelja. Koliko je god moguće.

Automatizacija smanjuje vrijeme zastoja između operacija i omogućuje istovremeno pružanje više poslužitelja. Vjerojatnost pogrešaka uzrokovanih ljudskim čimbenicima također je znatno smanjena.

Do-it-yourself Bare-Metal Provisioning ili automatska priprema poslužitelja od nule

Kako se poslužitelji automatski konfiguriraju?

Analizirajmo sve faze u detalje.

Imate Linux poslužitelj koji koristite kao PXE instalacijski poslužitelj. Na njemu su instalirane i konfigurirane usluge: DHCP, TFTP.

Dakle, dižemo poslužitelj (koji treba konfigurirati) preko PXE. Prisjetimo se kako to funkcionira:

  • Mrežno pokretanje odabrano je na poslužitelju.
  • Poslužitelj učitava PXE-ROM mrežne kartice i kontaktira instalacijski poslužitelj putem DHCP-a kako bi dobio mrežnu adresu.
  • DHCP instalacijski poslužitelj izdaje adresu, kao i upute za daljnje preuzimanje putem PXE.
  • Poslužitelj učitava mrežni bootloader s instalacijskog poslužitelja putem PXE-a, daljnje učitavanje odvija se prema PXE konfiguracijskoj datoteci.
  • Dizanje se odvija na temelju primljenih parametara (kernel, initramfs, mount point, squashfs image, itd.).

Bilješka. U članku je opisano dizanje putem PXE putem BIOS moda. Trenutno proizvođači aktivno implementiraju UEFI bootmode. Za PXE, razlika će biti u konfiguraciji DHCP poslužitelja i prisutnosti dodatnog pokretačkog programa.

Pogledajmo primjer konfiguracije PXE poslužitelja (pxelinux izbornik).

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

Datoteka 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=”…”

Kernel i initramfs u ovoj su fazi posredna slika Linuxa, uz pomoć koje će se odvijati glavna priprema i konfiguracija poslužitelja.

Kao što vidite, bootloader prosljeđuje mnogo parametara kernelu. Neke od ovih parametara koristi sam kernel. A neke možemo koristiti za vlastite potrebe. O tome će biti riječi kasnije, ali za sada se možete samo sjetiti da će svi proslijeđeni parametri biti dostupni u međusnimku Linuxa putem /proc/cmdline.

Gdje ih mogu nabaviti, kernel i initramfs?
Kao osnovu možete odabrati bilo koju distribuciju Linuxa. Na što obraćamo pažnju pri odabiru:

  • slika za pokretanje mora biti univerzalna (dostupnost upravljačkih programa, mogućnost instaliranja dodatnih uslužnih programa);
  • Najvjerojatnije ćete morati prilagoditi initramfs.

Kako se to radi u našem rješenju za X5? Kao osnova je odabran CentOS 7. Isprobajmo sljedeći trik: pripremimo buduću strukturu slike, spakiramo je u arhivu i napravimo initramfs unutar kojeg će biti naša arhiva datotečnog sustava. Prilikom učitavanja slike, arhiva će se proširiti u kreiranu tmpfs particiju. Na ovaj način ćemo dobiti minimalnu, ali potpunu live linux sliku sa svim potrebnim uslužnim programima, koja se sastoji od samo dvije datoteke: vmkernel i 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

Dakle, odredili smo kernel i initramfs koji se trebaju učitati. Kao rezultat toga, u ovoj fazi, učitavanjem međulinux slike putem PXE-a, dobit ćemo OS konzolu.

Super, ali sada moramo prenijeti kontrolu na našu "automatizaciju".

Može se i ovako.

Pretpostavimo da nakon učitavanja slike planiramo prenijeti kontrolu na skriptu mount.sh.
Uključimo skriptu mount.sh u automatsko pokretanje. Da biste to učinili, morat ćete izmijeniti initramfs:

  • raspakirajte initramfs (ako koristimo gornju opciju initramfs, to nije potrebno)
  • uključite kod u pokretanje koji će analizirati parametre koji prolaze kroz /proc/cmdline i prenijeti kontrolu dalje;
  • pakirati initramfs.

Bilješka. U slučaju X5 alata, kontrola učitavanja prenosi se na skriptu /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Dakle, učitava se slika u kojoj se skripta mount.sh pokreće pri automatskom pokretanju. Zatim, skripta mount.sh analizira proslijeđene parametre (script_cmd=) tijekom izvođenja i pokreće potrebni program/skriptu.

alat za naljepnice-automobil
zrno...
dodati...nfs_toolkit_script=skripte/mount.sh script_cmd=master-install.sh

alat za naljepnice-školjka
zrno...
dodati...nfs_toolkit_script=skripte/mount.sh skripta_cmd=/bin/bash

Do-it-yourself Bare-Metal Provisioning ili automatska priprema poslužitelja od nule

Ovdje lijevo je PXE izbornik, desno je dijagram prijenosa kontrole.

Shvatili smo prijenos kontrole. Ovisno o izboru PXE izbornika, pokreće se ili skripta za automatsku konfiguraciju ili konzola za otklanjanje pogrešaka.

U slučaju automatske konfiguracije, potrebni direktoriji se montiraju s instalacijskog poslužitelja koji sadrže:

  • skripte;
  • spremljeni BIOS/UEFI predlošci za razne poslužitelje;
  • firmware;
  • pomoćni programi poslužitelja;
  • cjepanice

Zatim, skripta mount.sh prenosi kontrolu na skriptu master-install.sh iz direktorija skripti.

Stablo skripti (redoslijed kojim se pokreću) izgleda otprilike ovako:

  • master-install
  • sharefunctions (dijeljene funkcije)
  • info (izlaz informacija)
  • modeli (postavljanje instalacijskih parametara na temelju modela poslužitelja)
  • pripreme_utils (instalacija potrebnih pomoćnih programa)
  • fwupdate (ažuriranje firmvera)
  • diag (elementarna dijagnostika)
  • biosconf (BIOS/UEFI postavke)
  • clockfix (postavljanje vremena na matičnoj ploči)
  • srmconf (konfiguracija sučelja udaljenog sučelja)
  • raidconf (konfiguriranje logičkih jedinica)

jedan od:

  • predinstalacija (prijenos kontrole na OS ili instalacijski program hipervizora, kao što je ESXi)
  • merged-install (trenutni početak raspakiranja slike)

Sada znamo:

  • kako pokrenuti poslužitelj putem PXE-a;
  • kako prenijeti kontrolu na vlastitu skriptu.


Nastavimo. Sljedeća su pitanja postala relevantna:

  • Kako prepoznati poslužitelj koji pripremamo?
  • Koji uslužni programi i kako konfigurirati poslužitelj?
  • Kako doći do postavki za određeni poslužitelj?

Kako prepoznati poslužitelj koji pripremamo?

Jednostavno je - DMI:

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

Sve što trebate je ovdje: dobavljač, model, serijski broj. Ako niste sigurni da su ove informacije prisutne na svim poslužiteljima, možete ih identificirati po njihovoj MAC adresi. Ili na oba načina istovremeno, ako su dobavljači poslužitelja različiti i na nekim modelima jednostavno nema informacija o serijskom broju.

Na temelju primljenih informacija, mrežne mape se montiraju s instalacijskog poslužitelja i učitava se sve što je potrebno (uslužni programi, firmware itd.).

Koji uslužni programi i kako konfigurirati poslužitelj?

Osigurat ću pomoćne programe za Linux za neke proizvođače. Svi uslužni programi dostupni su na službenim web stranicama dobavljača.

Do-it-yourself Bare-Metal Provisioning ili automatska priprema poslužitelja od nule

S firmwareom, mislim da je sve jasno. Obično dolaze u obliku zapakiranih izvršnih datoteka. Izvršna datoteka kontrolira proces ažuriranja firmvera i javlja povratni kod.

BIOS i IPMI obično se konfiguriraju putem predložaka. Ako je potrebno, predložak se može urediti prije preuzimanja.

RAID pomoćni programi nekih proizvođača također se mogu konfigurirati pomoću predloška. Ako to nije slučaj, morat ćete napisati konfiguracijsku skriptu.

Procedura postavljanja RAID-a je najčešće sljedeća:

  • Tražimo trenutnu konfiguraciju.
  • Ako već postoje logični nizovi, brišemo ih.
  • Pogledajmo koji su fizički diskovi prisutni i koliko ih ima.
  • Stvorite novi logički niz. U slučaju greške prekidamo proces.

Kako doći do postavki za određeni poslužitelj?

Pretpostavimo da će postavke svih poslužitelja biti pohranjene na instalacijskom poslužitelju. U ovom slučaju, da bismo odgovorili na naše pitanje, prvo moramo odlučiti kako prenijeti postavke na instalacijski poslužitelj.

U početku se možete snaći s tekstualnim datotekama. (U budućnosti biste mogli upotrijebiti tekstualnu datoteku kao zamjensku metodu za prijenos postavki.)

Možete "dijeliti" tekstualnu datoteku na instalacijskom poslužitelju. I dodajte njegovo montiranje u skriptu mount.sh.

Linije će, na primjer, izgledati ovako:

<serijski broj> <naziv glavnog računala> <podmreža>

Te će retke u datoteku prenijeti inženjer sa svog radnog stroja. A onda, prilikom postavljanja poslužitelja, iz datoteke će se očitati parametri za određeni poslužitelj.

No, dugoročno gledano, bolje je koristiti bazu podataka za pohranu postavki, stanja i zapisa instalacija poslužitelja.

Naravno, sama baza podataka nije dovoljna, već ćete morati izraditi klijentski dio pomoću kojeg će se postavke prenositi u bazu. Ovo je teže implementirati u usporedbi s tekstualnom datotekom, ali zapravo sve nije tako teško kao što se čini. Sasvim je moguće sami napisati minimalnu verziju klijenta koji će jednostavno prenijeti podatke u bazu. A u budućnosti će biti moguće poboljšati klijentski program u besplatnom načinu rada (izvješća, ispis naljepnica, slanje obavijesti itd. što vam padne na pamet).

Posebnim zahtjevom prema bazi podataka i navođenjem serijskog broja poslužitelja, dobit ćemo potrebne parametre za konfiguraciju poslužitelja.

Osim toga, nećemo morati smišljati brave za simultani pristup, kao što je slučaj s tekstualnom datotekom.

Možemo pisati dnevnik konfiguracije u bazu podataka u svim fazama i kontrolirati proces instalacije putem događaja i oznaka pripremnih faza.

Sada znamo kako:

  • pokrenite poslužitelj putem PXE;
  • prijenos kontrole na našu skriptu;
  • identifikaciju poslužitelja koji treba pripremiti po njegovom serijskom broju;
  • konfigurirajte poslužitelj pomoću odgovarajućih uslužnih programa;
  • prijenos postavki u bazu podataka instalacijskog poslužitelja pomoću klijentskog dijela.

Saznali smo kako:

  • instalirani poslužitelj prima potrebne postavke iz baze podataka;
  • sav napredak priprema bilježi se u bazi podataka (dnevnici, događaji, oznake pozornice).

Što je s različitim vrstama softvera koje instalirate? Kako instalirati hipervizor, kopirati VM i sve to konfigurirati?

U slučaju postavljanja slike datotečnog sustava (linux) na hardver, sve je vrlo jednostavno:

  • Nakon postavljanja svih komponenti poslužitelja, postavljamo sliku.
  • Instalirajte grub bootloader.
  • Chrootamo i konfiguriramo sve što je potrebno.

Kako prenijeti kontrolu na instalater OS-a (koristeći ESXi kao primjer).

  • Organiziramo prijenos kontrole s naše skripte na instalacijski program hipervizora pomoću datoteke s automatskim odgovorom (kickstart):
  • Brišemo trenutne particije na disku.
  • Napravite particiju veličine 500 MB.
  • Označavamo ga kao bootable.
  • Formatiraj u FAT32.
  • Instalacijske datoteke ESXi kopiramo u root.
  • Instaliranje syslinuxa.
  • Kopirajte syslinux.cfg u /syslinux/

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

  • Kopirajte mboot.c32 u /syslinux.
  • Boot.cfg bi trebao imati kernelopt=ks=ftp:// /ks_esxi.cfg
  • Ponovno pokrećemo server.

Nakon što se poslužitelj ponovno pokrene, ESXi instalacijski program će se preuzeti s tvrdog diska poslužitelja. Sve potrebne instalacijske datoteke učitat će se u memoriju i tada će započeti ESXi instalacija, prema navedenoj datoteci automatskog odgovora.

Evo nekoliko redaka iz datoteke 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

U ovoj fazi se instalira i konfigurira hipervizor, a virtualni strojevi se kopiraju.

Kako sada konfigurirati virtualne strojeve?

Malo smo varali: tijekom instalacije postavili smo parametar guestinfo.esxihost.id = "$SYSSN" u datoteci VM1.vmx i naveli serijski broj fizičkog poslužitelja u njemu.

Sada, nakon pokretanja, virtualni stroj (s instaliranim paketom vmware-tools) može pristupiti ovom parametru:

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

Odnosno, VM će se moći identificirati (zna serijski broj fizičkog hosta), uputiti zahtjev bazi podataka instalacijskog poslužitelja i primiti parametre koje je potrebno konfigurirati. Sve je to sastavljeno u skriptu koja bi se trebala automatski pokrenuti kada se pokrene guestos vm (ali jednom: RunOnce).

Sada znamo kako:

  • pokrenite poslužitelj putem PXE;
  • prijenos kontrole na našu skriptu;
  • identifikaciju poslužitelja koji treba pripremiti po njegovom serijskom broju;
  • konfigurirajte poslužitelj pomoću odgovarajućih uslužnih programa;
  • prijenos postavki u bazu podataka instalacijskog poslužitelja pomoću klijentskog dijela;
  • konfigurirati različite vrste softvera, uključujući postavljanje esxi hipervizora i konfiguriranje virtualnih strojeva (sve automatski).

Saznali smo kako:

  • instalirani poslužitelj prima potrebne postavke iz baze podataka;
  • sav napredak priprema bilježi se u bazi podataka (dnevnici, događaji, oznake pozornice).


Dno crta:

Vjerujem da je jedinstvenost ovog rješenja u njegovoj fleksibilnosti, jednostavnosti, mogućnostima i svestranosti.

Napišite u komentarima što mislite.

Izvor: www.habr.com

Dodajte komentar