Do-it-yourself Bare-Metal Provisioning ali avtomatska priprava strežnikov iz nič

Pozdravljeni, sem Denis in eno od mojih področij delovanja je razvoj infrastrukturnih rešitev v X5. Danes bi rad z vami delil, kako lahko namestite avtomatski sistem za pripravo strežnika, ki temelji na javno dostopnih orodjih. Po mojem mnenju je to zanimiva, enostavna in prilagodljiva rešitev.

Do-it-yourself Bare-Metal Provisioning ali avtomatska priprava strežnikov iz nič

S pripravo mislimo: spremenite nov strežnik iz škatle v popolnoma konfiguriran strežnik z OS. Linux ali s hipervizorjem ESXi (uvedba strežnikov Windows v tem članku ni obravnavana).

pogoji:

  • strežniki – strežniki, ki jih je treba konfigurirati.
  • namestitveni strežnik je glavni strežnik, ki omogoča celoten proces priprave preko omrežja.

Zakaj je potrebna avtomatizacija?

Recimo, da obstaja naloga: množično pripraviti strežnike iz nič, na vrhuncu - 30 na dan. Na njih so lahko nameščeni strežniki različnih proizvajalcev in modelov, različni operacijski sistemi, imajo lahko hipervizor ali pa tudi ne.

Katere operacije so vključene v postopek namestitve (brez avtomatizacije):

  • priključite tipkovnico, miško, monitor na strežnik;
  • konfigurirajte BIOS, RAID, IPMI;
  • posodobite vdelano programsko opremo komponente;
  • namestite sliko datotečnega sistema (ali namestite hipervizor in kopirajte virtualne stroje);

Opomba. Namesto tega je možna uvedba OS z namestitvijo z datoteko s samodejnim odzivom. Toda o tem v članku ne bomo govorili. Čeprav boste spodaj videli, da dodajanje te funkcionalnosti ni težko.

  • konfigurirajte parametre OS (ime gostitelja, IP itd.).

S tem pristopom se iste nastavitve izvajajo zaporedno na vsakem strežniku. Učinkovitost takega dela je zelo nizka.

Bistvo avtomatizacije je izključitev človeškega sodelovanja iz procesa priprave strežnika. Kolikor je mogoce.

Avtomatizacija skrajša čas nedelovanja med operacijami in omogoča oskrbo več strežnikov hkrati. Močno se zmanjša tudi verjetnost napak zaradi človeških dejavnikov.

Do-it-yourself Bare-Metal Provisioning ali avtomatska priprava strežnikov iz nič

Kako so strežniki samodejno konfigurirani?

Podrobno analizirajmo vse faze.

Imate strežnik Linux, ki ga uporabljate kot namestitveni strežnik PXE. Na njem so nameščene in konfigurirane storitve: DHCP, TFTP.

Torej, zaženemo strežnik (ki ga je treba konfigurirati) prek PXE. Spomnimo se, kako deluje:

  • Na strežniku je izbran omrežni zagon.
  • Strežnik naloži PXE-ROM omrežne kartice in vzpostavi stik z namestitvenim strežnikom prek DHCP, da pridobi omrežni naslov.
  • Namestitveni strežnik DHCP izda naslov in navodila za nadaljnji prenos preko PXE.
  • Strežnik naloži omrežni zagonski nalagalnik iz namestitvenega strežnika prek PXE, nadaljnje nalaganje poteka v skladu s konfiguracijsko datoteko PXE.
  • Zagon se izvede na podlagi prejetih parametrov (jedro, initramfs, točke priklopa, slika squashfs itd.).

Opomba. Članek opisuje zagon prek PXE prek načina BIOS. Trenutno proizvajalci aktivno izvajajo zagonski način UEFI. Za PXE bo razlika v konfiguraciji strežnika DHCP in prisotnosti dodatnega zagonskega nalagalnika.

Oglejmo si primer konfiguracije strežnika PXE (meni pxelinux).

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

Jedro in initramfs sta na tej stopnji vmesna slika Linuxa, s pomočjo katere bo potekala glavna priprava in konfiguracija strežnika.

Kot lahko vidite, zagonski nalagalnik posreduje veliko parametrov jedru. Nekatere od teh parametrov uporablja samo jedro. In nekatere lahko uporabimo za lastne namene. O tem bomo razpravljali kasneje, za zdaj pa si lahko samo zapomnite, da bodo vsi posredovani parametri na voljo v vmesni sliki Linuxa prek /proc/cmdline.

Kje jih lahko dobim, kernel in initramfs?
Kot osnovo lahko izberete katero koli distribucijo Linuxa. Na kaj smo pozorni pri izbiri:

  • zagonska slika mora biti univerzalna (razpoložljivost gonilnikov, možnost namestitve dodatnih pripomočkov);
  • Najverjetneje boste morali prilagoditi initramfs.

Kako je to storjeno v naši rešitvi za X5? Za osnovo je bil izbran CentOS 7. Poskusimo z naslednjim trikom: pripravimo strukturo bodoče slike, jo zapakiramo v arhiv in ustvarimo initramfs, znotraj katerega bo naš arhiv datotečnega sistema. Pri nalaganju slike bo arhiv razširjen v ustvarjeno particijo tmpfs. Tako bomo dobili minimalno, a polno živo sliko linuxa z vsemi potrebnimi pripomočki, sestavljeno iz samo dveh datotek: vmkernel in 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

Tako smo določili jedro in initramfs, ki naj se naložijo. Posledično bomo na tej stopnji z nalaganjem vmesne slike linux prek PXE prejeli konzolo OS.

Super, zdaj pa moramo nadzor prenesti na našo »avtomatizacijo«.

Lahko se naredi tako.

Predpostavimo, da nameravamo po nalaganju slike prenesti nadzor na skript mount.sh.
Vključimo skript mount.sh v samodejni zagon. Če želite to narediti, boste morali spremeniti initramfs:

  • odpakirajte initramfs (če uporabimo zgornjo možnost initramfs, to ni potrebno)
  • vključite kodo v zagon, ki bo analizirala parametre, posredovane skozi /proc/cmdline, in prenesla nadzor naprej;
  • pakiraj initramfs.

Opomba. V primeru kompleta orodij X5 se nadzor nalaganja prenese na skript /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Tako se naloži slika, v kateri se skript mount.sh zažene ob samodejnem zagonu. Nato skript mount.sh med izvajanjem analizira posredovane parametre (script_cmd=) in zažene potreben program/skript.

komplet orodij za nalepke -avto
jedro...
pripni... nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

komplet orodij za nalepke -shell
jedro...
pripni... nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Do-it-yourself Bare-Metal Provisioning ali avtomatska priprava strežnikov iz nič

Tukaj na levi je meni PXE, na desni je diagram prenosa krmiljenja.

Ugotovili smo prenos nadzora. Odvisno od izbire menija PXE se zažene skript za samodejno konfiguracijo ali konzola za odpravljanje napak.

V primeru samodejne konfiguracije se iz namestitvenega strežnika priklopijo potrebni imeniki, ki vsebujejo:

  • skripte;
  • shranjene predloge BIOS/UEFI za različne strežnike;
  • vdelana programska oprema;
  • strežniški pripomočki;
  • dnevniki

Nato skript mount.sh prenese nadzor na skript master-install.sh iz imenika skriptov.

Drevo skriptov (vrstni red, v katerem so zagnani) izgleda nekako takole:

  • glavna namestitev
  • sharefunctions (deljene funkcije)
  • info (izhod informacij)
  • modeli (nastavitev namestitvenih parametrov glede na model strežnika)
  • pripravi_utils (namestitev potrebnih pripomočkov)
  • fwupdate (posodobitev vdelane programske opreme)
  • diag (elementarna diagnostika)
  • biosconf (nastavitve BIOS/UEFI)
  • clockfix (nastavitev časa na matični plošči)
  • srmconf (konfiguracija vmesnika oddaljenega vmesnika)
  • raidconf (konfiguriranje logičnih nosilcev)

eden od:

  • prednamestitev (prenos nadzora na operacijski sistem ali namestitveni program hipervizorja, kot je ESXi)
  • združena namestitev (takojšen začetek razpakiranja slike)

Zdaj vemo:

  • kako zagnati strežnik prek PXE;
  • kako prenesti nadzor na svoj skript.


Nadaljujmo. Ustrezna so postala naslednja vprašanja:

  • Kako prepoznati strežnik, ki ga pripravljamo?
  • Kateri pripomočki in kako konfigurirati strežnik?
  • Kako pridobiti nastavitve za določen strežnik?

Kako prepoznati strežnik, ki ga pripravljamo?

Preprosto je - DMI:

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

Vse, kar potrebujete, je tukaj: prodajalec, model, serijska številka. Če niste prepričani, da so te informacije prisotne v vseh strežnikih, jih lahko prepoznate po naslovu MAC. Ali na oba načina hkrati, če so prodajalci strežnikov različni in na nekaterih modelih preprosto ni podatkov o serijski številki.

Na podlagi prejetih informacij se omrežne mape priklopijo iz namestitvenega strežnika in naloži vse potrebno (pripomočki, vdelana programska oprema itd.).

Kateri pripomočki in kako konfigurirati strežnik?

Nekaterim proizvajalcem bom zagotovil pripomočke za Linux. Vsi pripomočki so na voljo na uradnih spletnih mestih prodajalcev.

Do-it-yourself Bare-Metal Provisioning ali avtomatska priprava strežnikov iz nič

Z vdelano programsko opremo mislim, da je vse jasno. Običajno so v obliki pakiranih izvršljivih datotek. Izvršljiva datoteka nadzira postopek posodabljanja vdelane programske opreme in poroča povratno kodo.

BIOS in IPMI sta običajno konfigurirana prek predlog. Po potrebi lahko predlogo uredite pred prenosom.

Pripomočke RAID nekaterih proizvajalcev je mogoče konfigurirati tudi s predlogo. Če temu ni tako, boste morali napisati konfiguracijski skript.

Postopek nastavitve RAID je najpogosteje naslednji:

  • Zahtevamo trenutno konfiguracijo.
  • Če že obstajajo logični nizi, jih izbrišemo.
  • Poglejmo, kateri fizični diski so prisotni in koliko jih je.
  • Ustvarite novo logično matriko. V primeru napake proces prekinemo.

Kako pridobiti nastavitve za določen strežnik?

Predpostavimo, da bodo nastavitve vseh strežnikov shranjene na namestitvenem strežniku. V tem primeru se moramo za odgovor na naše vprašanje najprej odločiti, kako prenesti nastavitve na namestitveni strežnik.

Sprva lahko preživite z besedilnimi datotekami. (V prihodnosti boste morda želeli uporabiti besedilno datoteko kot nadomestno metodo za prenos nastavitev.)

Na namestitvenem strežniku lahko »delite« besedilno datoteko. In dodajte njegovo namestitev v skript mount.sh.

Vrstice bodo na primer videti takole:

<serijska številka> <ime gostitelja> <podomrežje>

Te vrstice bo v datoteko prenesel inženir s svojega delovnega stroja. In potem, pri nastavitvi strežnika, bodo parametri za določen strežnik prebrani iz datoteke.

Dolgoročno pa je za shranjevanje nastavitev, stanj in dnevnikov namestitve strežnika bolje uporabiti bazo podatkov.

Seveda pa sama baza podatkov ni dovolj, ampak boste morali ustvariti odjemalski del, s pomočjo katerega se bodo nastavitve prenašale v bazo. To je težje izvesti v primerjavi z besedilno datoteko, vendar v resnici vse ni tako težko, kot se zdi. Povsem mogoče je, da sami napišete minimalno različico odjemalca, ki bo preprosto prenašal podatke v bazo podatkov. In v prihodnosti bo možno izboljšati odjemalski program v brezplačnem načinu (poročila, tiskanje nalepk, pošiljanje obvestil itd., kar pride na misel).

S posebno zahtevo v bazi podatkov in navedbo serijske številke strežnika bomo prejeli potrebne parametre za konfiguracijo strežnika.

Poleg tega nam ne bo treba izmisliti ključavnic za hkratni dostop, kot je to v primeru besedilne datoteke.

Konfiguracijski dnevnik lahko zapišemo v bazo podatkov na vseh stopnjah in nadzorujemo proces namestitve prek dogodkov in zastavic pripravljalnih stopenj.

Zdaj vemo, kako:

  • zagon strežnika prek PXE;
  • prenos nadzora na naš skript;
  • določite strežnik, ki ga je treba pripraviti, po njegovi serijski številki;
  • konfigurirajte strežnik z uporabo ustreznih pripomočkov;
  • prenesite nastavitve v bazo podatkov namestitvenega strežnika s pomočjo odjemalskega dela.

Ugotovili smo, kako:

  • nameščeni strežnik prejme potrebne nastavitve iz baze podatkov;
  • ves potek priprav se beleži v podatkovni bazi (dnevniki, dogodki, zastavice na stopnji).

Kaj pa različne vrste programske opreme, ki jo namestite? Kako namestiti hipervizor, kopirati VM in vse to konfigurirati?

V primeru uvajanja slike datotečnega sistema (linux) na strojno opremo je vse precej preprosto:

  • Po nastavitvi vseh komponent strežnika razmestimo sliko.
  • Namestite zagonski nalagalnik grub.
  • Izvajamo chroot in konfiguriramo vse, kar je potrebno.

Kako prenesti nadzor na namestitveni program OS (na primeru ESXi).

  • Organiziramo prenos nadzora iz naše skripte v namestitveni program hipervizorja s pomočjo samodejne odzivne datoteke (kickstart):
  • Izbrišemo trenutne particije na disku.
  • Ustvarite particijo velikosti 500 MB.
  • Označimo ga kot zagonskega.
  • Formatiraj v FAT32.
  • Namestitvene datoteke ESXi kopiramo v koren.
  • Namestitev syslinux.
  • Kopirajte syslinux.cfg v /syslinux/

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

  • Kopirajte mboot.c32 v /syslinux.
  • Boot.cfg mora imeti kernelopt=ks=ftp:// /ks_esxi.cfg
  • Ponovno zaženite strežnik.

Ko se strežnik znova zažene, se bo namestitveni program ESXi prenesel s trdega diska strežnika. Vse potrebne namestitvene datoteke bodo naložene v pomnilnik in nato se bo začela namestitev ESXi v skladu z navedeno datoteko samodejnega odziva.

Tukaj je nekaj vrstic iz datoteke samodejnega odziva 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

Na tej stopnji je hipervizor nameščen in konfiguriran, virtualni stroji pa kopirani.

Kako zdaj konfigurirati virtualne stroje?

Malce smo goljufali: med namestitvijo smo v datoteki VM1.vmx nastavili parameter guestinfo.esxihost.id = "$SYSSN" in v njej navedli serijsko številko fizičnega strežnika.

Zdaj, po zagonu, lahko virtualni stroj (z nameščenim paketom vmware-tools) dostopa do tega parametra:

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

To pomeni, da se bo VM lahko identificiral (pozna serijsko številko fizičnega gostitelja), poslal zahtevo v bazo podatkov namestitvenega strežnika in prejel parametre, ki jih je treba konfigurirati. Vse to je prevedeno v skript, ki bi se moral samodejno zagnati, ko se zažene guestos vm (vendar enkrat: RunOnce).

Zdaj vemo, kako:

  • zagon strežnika prek PXE;
  • prenos nadzora na naš skript;
  • določite strežnik, ki ga je treba pripraviti, po njegovi serijski številki;
  • konfigurirajte strežnik z uporabo ustreznih pripomočkov;
  • prenesite nastavitve v bazo podatkov namestitvenega strežnika s pomočjo odjemalskega dela;
  • konfigurirati različne vrste programske opreme, vključno z uvajanjem hipervizorja esxi in konfiguracijo virtualnih strojev (vse samodejno).

Ugotovili smo, kako:

  • nameščeni strežnik prejme potrebne nastavitve iz baze podatkov;
  • ves potek priprav se beleži v podatkovni bazi (dnevniki, dogodki, zastavice na stopnji).


Bottom line:

Menim, da je edinstvenost te rešitve v njeni prilagodljivosti, preprostosti, zmogljivosti in vsestranskosti.

Prosimo, napišite v komentarjih, kaj mislite.

Vir: www.habr.com

Dodaj komentar