Tere, mina olen Denis ja üks minu tegevusvaldkondi on infrastruktuuri lahenduste väljatöötamine X5. Täna tahan jagada teiega, kuidas kasutada avalikult kätte saadavaid tööriistu automaatse serverite ettevalmistussüsteemi käivitamiseks. Minu arvates on see huvitav, lihtne ja paindlik lahendus.

Ettevalmistuse all mõeldakse: luua täiesti seadistatud server uhiuue serveri põhjal, millel on Linuxi operatsioonisüsteem või hypervisor ESXi (Windowsit selles artiklis ei käsitleta). serverite serverid – serverid, mida tuleb seadistada.
Terminid:
- install-server – peamine server, mis tagab kogu ettevalmistusprotsessi üle võrgu.
- Miks on automatiseerimine vajalik?
Oletame, et on ülesanne: massiliselt ette valmistada servereid nullist, tipptasemel kuni 30 päevas. Serverid on erinevate tootjate ja mudelite, neile võivad olla installitud erinevad operatsioonisüsteemid ning võib olla kohal või puududa hypervisor.
Millised tegevused sisalduvad seadistamisprotsessis (ilma automatiseerimiseta):
ühendada serveriga klaviatuur, hiir, monitor;
- seadistada BIOS, RAID, IPMI;
- BIOS-i, RAID-i, IPMI seadistamine;
- uuendage komponentide püsivara;
- rakendage failisüsteemi pilti (või installige hüperviisor ja kopeerige virtuaalmasinad);
Märkus. OS-i juurutamine on võimalik ka automaatvastuste failiga installimise kaudu. Kuid seda ei käsitleta artiklis. Siiski näete allpool, et selle funktsiooni lisamine ei ole keeruline.
- seadistage OS-i parameetrid (hostname, IP jne).
Antud lähenemisviisi korral tehakse ühetaolised seadistused järjestikku igas serveris. Sellise töö efektiivsus on väga madal.
Automaatimise eesmärk on vähendada inimese osalemist serveri ettevalmistamise protsessis. Võimalikult palju.
Automatiseerimise tõttu väheneb seisakuaeg operatsioonide vahel ja on võimalik ette valmistada mitu serverit samaaegselt. Samuti väheneb oluliselt inimfaktorist tingitud vigade tekkimise tõenäosus.

Kuidas toimub serverite automaatne seadistamine?
Käime kõik etapid üksikasjalikult läbi.
Teil on Linuxi server, mida kasutate PXE installiserverina. Sellel on seadistatud teenused: DHCP, TFTP.
Nii, laadime serveri (mida tuleb seadistada) PXE kaudu. Tuletame meelde, kuidas see töötab:
- Serveris on valitud võrgu kaudu käivitus.
- Server laadib võrkaartide PXE-ROM-i ja pöördub DHCP installiserveri poole, et saada võrguaadress.
- DHCP installiserver annab välja aadressi ning juhised edasise käivitamise kohta PXE kaudu.
- Server laadib PXE kaudu installiserverilt võrgu käivitaja, edasine laadimine toimub vastavalt PXE konfiguratsioonifailile.
- Laadimine toimub saadud parameetrite põhjal (tuum, initramfs, mount-punktid, squashfs pilt ja muu).
Märkus. Artiklis on kirjeldatud PXE laadimist BIOS režiimi kaudu. Praegu rakendavad tootjad aktiivselt UEFI käivitamisrežiimi. PXE puhul on erinevus DHCP-serveri konfiguratsioonis ja lisakäivitaja olemasolus.
Kaalume PXE-serveri konfiguratsiooni näidet (pxelinux menüü).
Fail pxelinux.cfg/default:
default menu.c32
prompt 0
timeout 100
menu title X5 PXE Käivitamise Menüü
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 // vaikimisi menüü
MENU LABEL Linux Scripting Toolkits
MENU default
KERNEL menu.c32
APPEND pxelinux.cfg/toolkit // üleminek järgmisele menüüleFail pxelinux.cfg/toolkit:
prompt 0
timeout 100
menu title X5 PXE Boot Menu
label mainmenu
menu label ^Tagasi peamenüüsse
kernel menu.c32
append pxelinux.cfg/default
label x5toolkit-auto // vaikimisi — automaatne režiim
menu label x5 toolkit automaatinstall
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 // tõrkeotsing - konsool
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="…"Praegu on kernel ja initramfs vahepealne linux-pilt, mille abil toimub muu hulgas serveri ettevalmistamine ja seadistamine.
Kuidas näete, edastab laadija paljusid parameetreid kerneli. Osa neist parameetritest kasutatakse otse kernelis. Teisi saame kasutada oma eesmärkidel. Selle üle räägitakse hiljem, aga praegu võib lihtsalt meeles pidada, et kõik edastatud parameetrid on saadaval vahepealses linux-pildis kaudu /proc/cmdline.
Kust neid saada, kernel ja initramfs?
Tõhususe aluseks võib valida ükskõik millise linuxi distributsiooni. Millele peame valiku tegemisel tähelepanu pöörama:
- Käivitamise pilt peab olema universaalne (draiverite olemasolu, täiendavate utiliitide installimise võimalused);
- Võimalik, et initramfs tuleb kohandada.
Kuidas see meie lahenduses X5 tehakse? Aluseks on valitud CentOS 7. Teeme järgmise triki: valmistame ette tulevase pildi struktuuri, pakime selle arhiivi ja loome initramfs, mille sees on meie failisüsteemi arhiiv. Pildi laadimisel arhiiv lahti ning kopeeritakse loodavasse tmpfs jagusse. Nii saame minimaalse, kuid täieõigusliku Linuxi live-pildi koos kõikide vajalike utiliitidega, mis koosneb vaid kahest failist: vmkernel ja 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.gzNii oleme määranud ydra ja initramfs, mis tuleb laadida. Selle tulemuseks on, et praeguses etapis, laadides Linuxi vahepildi PXE kaudu, saame OS-i konsooli.
Suurepärane, kuid nüüd tuleb juhtimine üle anda meie „automaatikale”.
Seda saab teha nii.
Oletame, et pärast pildi laadimist plaanime juhtimise üle anda skriptile mount.sh.
Käivitame skripti mount.sh autor käivitamise. Selleks tuleb initramfs modifitseerida:
- dekompresseerida initramfs (kui kasutame ülaltoodud initramfs variant, ei ole see vajalik)
- lülitage automaatne laadimine koodi, mis analüüsib edastatud parameetreid läbi /proc/cmdline ja suunab juhtimise edasi;
- pakendage initramfs.
Märkus. X5 tööriistakomplekti puhul antakse käivitamise juhtimine skripti kaudu /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)
Nii käivitatakse pilt, mille automaatlaadimises käivitub skript mount.sh. Edasi analüüsib skript mount.sh oma käitamise käigus edastatud parameetreid (script_cmd=) ja käivitab vajaliku programmi/skripti.
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

Siin vasakul – PXE menüü, paremal – juhtimise edastamise skeem.
Juhtimise edastamise osas oleme nüüdsel teemal. Sõltuvalt PXE-menüü valikust käivitub kas automaatse seadistamise skript või silumisekonsol.
Automaatse seadistamise korral monteeritakse vajalikud kataloogid installiserverist, milles on:
- skriptid;
- salvestatud BIOS/UEFI mallid erinevatele serveritele;
- firmad;
- serveri utiliidid;
- logid.
Edasi edastab skript mount.sh juhtimise skripti master-install.sh skriptide kataloogist.
Skriptide puu (nende käivitamise järjestus) näeb välja umbes nii:
- master-install
- sharefunctions (üldised funktsioonid)
- info (informatsiooni väljund)
- mudelid (serveri mudeli põhjal installimise konfiguratsioon)
- prepare_utils (vajalike utiliitide installimine)
- fwupdate (firmware'i uuendamine)
- diag (elementaarne diagnostika)
- biosconf (BIOSi/UEFI seadistamine)
- clockfix (emapaiga aja seadistamine)
- srmconf (eemaldatava liidese seadistamine)
- raidconf (loogiliste mahu seadistamine)
üks järgmistest:
- preinstall (üleminek OS-i või hüpervisor-installijale, näiteks ESXi)
- merged-install (pildi allavõtu vahetu käivitamine)
Nüüd teame:
- kuidas käivitada serverit PXE kaudu;
- kuidas suunata juhtimine enda skripti.
Jätkame. Kätkeb järgmised küsimused:
- Kuidas tuvastada serverit, mida me ette valmistame?
- Milliste utiliitidega ja kuidas seadistada serverit?
- Kuidas saada konkreetse serveri seadistused?
Kuidas tuvastada serverit, mida me ette valmistame?
See on lihtne – DMI:
dmidecode –s system-product-name
dmidecode –s system-manufacturer
dmidecode –s system-serial-numberSiin on kõik vajalik: tootja, mudel, seerianumber. Kui te pole kindel, et see teave on olemas kõigil serveritel, saate neid tuvastada MAC-aadressi järgi. Või mõlema viisi abil samal ajal, kui serverite tootjad on erinevad ja mõnede mudelite seerianumbri teave on lihtsalt puudulik.
Saadud teabe põhjal monteeritakse võrgu kaustad installimistalitustest ja laaditakse kõik vajalik (utiliidid, püsivara jne).
Milliste utiliitidega ja kuidas seadistada serverit?
Toon utiliite Linuxile mõnede tootjate jaoks. Kõik utiliidid on saadaval tootjate ametlikelt veebilehtedelt.

Püsivara osas on kõik arusaadav. Tavaliselt tarnitakse neid pakitud täitmisfailidena. Täitmisfail kontrollib püsivara uuendamise protsessi ja edastab tagastuskoodi.
BIOS ja IPMI seadistatakse tavaliselt mallide kaudu. Vajadusel saab mallin enne laadimist redigeerida.
Mõnede tootjate RAID-utiliidid võivad samuti seadistada malli järgi. Kui see pole nii, siis tuleb kirjutada seadistamise skript.
RAID seadistamise järjekord on enamasti järgmine:
- Küsimine praeguse konfiguratsiooni kohta.
- Kui loogilised massiivid juba olemas on, kustutame need.
- Vaadake, millised füüsilised kettad on olemas ja kui palju neid on.
- Loome uue loogilise massiivi. Katkestame protsessi, kui tekib viga.
Kuidas saada konkreetse serveri seadistused?
Eeldame, et kõigi serverite seaded salvestatakse install-keskkonnas. Sel juhul, et vastata meie küsimusele, tuleb kõigepealt otsustada, kuidas edastada seaded install-keskkonda.
Alguses võib täiesti piisata tekstifailidest. (Tulevikus saab tekstifaili kasutada seadete edastamise varufailina).
Tekstifaili saab 'jagada' install-keskkonnas ja lisada selle mountimine skripti mount.sh.
Read on näiteks sellise kujuga:
Need read edastatakse inseneri poolt tema töökohalt faili. Ja edaspidi serveri seadistamisel loetakse konkreetse serveri parameetrid failist.
Aga tulevikus on parem kasutada andmebaasi seadete, olekute ja serverite installatsioonipäevikute salvestamiseks.
Muidugi ei piisa ühest andmebaasist, ja on vajalik luua kliendipool, mille abil edastatakse seaded andmebaasi. Selle teostamine on keerulisem võrreldes tekstifailiga, kuid tegelikult ei ole kõik nii raske, nagu tundub. Minimalistliku versiooni kliendist, mis lihtsalt edastab andmeid andmebaasi, on täiesti mõistlik kirjutada ise. Ja kliendi programmi edasist täiustamist saab teha vabamalt (aruanded, siltide printimine, teavituste saatmine ja muud ideed, mis pähe tulevad).
Tehes teatud päringu andmebaasis ja näidates serveri seerianumbrit, saame vajalikud parameetrid serveri seadistamiseks.
Lisaks ei ole meil vaja mõelda blokeeringutele samaaegse juurdepääsu jaoks, nagu tekstifailiga.
Seadistuse logi saame igas etapis kirjutada andmebaasi ja installimisprotsessi saame kontrollida sündmuste ja ettevalmistusetappide lipu kaudu.
Nüüd teame, kuidas:
- serverit PXE kaudu laadida;
- edastada juhtimine meie skriptile;
- tuvastada server, mida tuleb ette valmistada, seerianumbri järgi;
- konfigureerida server vastavate utiliitide abil;
- edastama seadistusi andmebaasi installiserverisse kliendi osa abil.
Selgitasime, kuidas:
- installitav server saab vajalikud seadistused andmebaasist;
- kogu ettevalmistuse progress fikseeritakse andmebaasis (logid, sündmused, etappide lipud).
Kuidas on lood erinevate installitavate tarkvaratüüpidega? Kuidas installida hüperviisor, kopeerida virtuaalmasin ja kõik see seadistada?
Failisüsteemi pildi (linux) riistvarale juurutamisel on kõik üsna lihtne:
- Pärast serveri kõikide komponentide seadistamist juurutame pildi.
- Paigaldame laaduri grub.
- Teeme chroot'i ja seadistame kõik vajalikud.
Kuidas juhtimist OS-i installijale edastada (näiteks ESXi korral).
- Korrastame juhtimise edastamise meie skriptist hüperviisori installijale vastuste failide (kickstart) kaudu:
- Kustutame praegused partitsioonid kettal.
- Loome 500MB suuruse partitsiooni.
- Märgistame selle käivitatavaks.
- Formateerime FAT32-s.
- Kopeerime sellele juurkausta ESXi installifailid.
- Paigaldame syslinuxi.
- Kopeerime syslinux.cfg faili /syslinux/
default esxi
prompt 1
timeout 50
label esxi
kernel mboot.c32
append -c boot.cfg- Kopeerime mboot.c32 faili /syslinux.
- Failis boot.cfg peab olema kernelopt=ks=ftp:///ks_esxi.cfg
- Taaskäivita server.
Serveri taaskäivitamisel laadib see ESXi installeri tema kõvakettalt. Kõik vajalikud installifailid laaditakse mällu ja seejärel algab ESXi installatsioon vastavalt määratud automaatvastuse failile.
Toon siin mõned read failist autoantwort ks_esxi.cfg:
%firstboot --interpreter=busybox
…
# saadame seerianumbri
SYSSN=$(esxcli hardware platform get | grep Serial | awk -F " " '{print $3}')
# saadame IP
IPADDRT=$(esxcli network ip interface ipv4 get | grep vmk0 | awk -F " " '{print $2}')
LAST_OCTET=$(echo $IPADDRT | awk -F'.' '{print $4}')
# ühenda NFS installiserveriga
esxcli storage nfs add -H is -s /srv/nfs_share -v nfsshare1
# kopeerime ajutised SSH seaded, et kasutada SSH klienti
mv /etc/ssh /etc/ssh.tmp
cp -R /vmfs/volumes/nfsshare1/ssh /etc/
chmod go-r /etc/ssh/ssh_host_rsa_key
# kopeerime ovftool, et VMidest praegu käivitada, lisaks võib sellest hiljem kasu olla
cp -R /vmfs/volumes/nfsshare1/ovftool /vmfs/volumes/datastore1/
# käivitame VMi
/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
# saame rea meie serveri seadistustest
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
...
# genereerime võrgu seadistusskripti
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
# määrame parameetrit guestinfo.esxihost.id, kus on seerianumber
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM1/VM1.vmx
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM2/VM2.vmx
...
# värskendame andmeid andmebaasis
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 ...""
# taastame SSH seaded
rm -rf /etc/ssh
mv /etc/ssh.tmp /etc/ssh
# seadistame võrgu ja taaskäivitame
esxcli system hostname set --fqdn=esx-${G_NICK}.x5.ru
/vmfs/volumes/datastore1/netconf.sh
reboot
Sellel etapil on hüperviisor seadistatud ja virtuaalmasinad kopeeritud.
Kuidas seadistada virtuaalseid masinareid?
Käitusime natuke nutikalt: paigaldamise käigus määrasime parameetri guestinfo.esxihost.id = "$SYSSN" failis VM1.vmx, märkides sinna füüsilise serveri seerianumbri.
Nüüd, pärast käivitamist, saab virtuaalmasin (kellel on paigaldatud vmware-tools pakett) sellele parameetrile juurde pääseda:
ESXI_SN=$(vmtoolsd --cmd "info-get guestinfo.esxihost.id")See tähendab, et VM suudab end tuvastada (ta tunneb füüsilise hosti seerianumbrit), teha päringu installiserveri andmebaasi ja saada konfigureerimiseks vajalikud parameetrid. Kõik see vormistatakse skriptiks, mis peab käivituma automaatselt, kui guestos vm käivitub (aga vaid korra: RunOnce).
Nüüd teame, kuidas:
- serverit PXE kaudu laadida;
- edastada juhtimine meie skriptile;
- tuvastada server, mida tuleb ette valmistada, seerianumbri järgi;
- seadistama serveri vastavate utiliitidega;
- edastama seadeid installiserveri andmebaasi kliendi osa abil;
- seadistama erinevaid tarkvaratüüpe, sealhulgas paigaldama esxi hüperviisori ja seadistama virtuaalmasinad (ja kõik automaatselt).
Selgitasime, kuidas:
- installitav server saab vajalikud seadistused andmebaasist;
- kogu ettevalmistuse progress fikseeritakse andmebaasis (logid, sündmused, etappide lipud).
Kokkuvõte:
Usun, et selle lahenduse unikaalsus seisneb selle paindlikkuses, lihtsuses, võimalustes ja universaalsuses.
Palun kirjutage kommentaaridesse, mida arvate.
Allikas: habr.com
