Tere, mina olen Denis ja üks minu tegevusvaldkondadest on infrastruktuuri lahenduste arendamine X5-s. Täna tahaksin jagada, kuidas avalike tööriistade baasil saab üles seada automaatse serverite ettevalmistamise süsteemi. Minu arvates on see huvitav, lihtne ja paindlik lahendus.

Ettevalmistusega mõistetakse: teha uue "karbi" serverist täielikult seadistatud server Linuxi op.süsteemiga või hyperviisoriga ESXi (jaotamine serverid Windowsi puhul seda artiklis ei käsitleta).
Terminid:
- serverid – serverid, mida tuleb seadistada.
- install-server – peamine server, mis tagab kogu ettevalmistusprotsessi üle võrgu.
Miks on automatiseerimine vajalik?
Oletame, et on ülesanne: massiliselt valmistada servereid nullist, tipphind 30 päeva jooksul. Serverid erinevatelt tootjatelt ja mudelitelt, neile võib paigaldada erinevaid op.süsteeme, võib olla või mitte olla hyperviisor.
Millised toimingud kuuluvad seadistamisprotsessi (ilma automatiseerimiseta):
- ühendada serverile klaviatuur, hiir, monitor;
- seadistada BIOS, RAID, IPMI;
- uuendada komponente tarkvara;
- rakendada failisüsteemi pilti (või paigaldada hyperviisor ja kopeerida virtuaalmasinad);
Märkus. Ühe variantina on op.süsteemi rakendamine võimalik auto-vastuse failiga. Kuid sellest artiklis ei räägita. Kuigi allpool näete, et selle funktsiooni lisamine pole keeruline.
- seadistada op.süsteemi parameetrid (hostname, IP, jne).
Selle lähenemisviisi korral viiakse igas serveris järjestikku läbi samad seadistused. Töö efektiivsus on väga madal.
Automatiseerimise sisu on välja jätta inimeste osalemine serveri ettevalmistamise protsessist. Nii palju kui võimalik.
Automatiseerimise abil vähendatakse seisaku aega toimingute vahel ja on võimalik ette valmistada mitu serverit samal ajal. Samuti väheneb oluliselt inimfaktorist põhjustatud vigade teke.

Kuidas toimub serverite automaatne seadistamine?
Uurime kõiki etappe detailsemalt.
Teil on Linuxi server, mida kasutate PXE install-serverina. Sellel on seadistatud ja töös DHCP ja TFTP teenused.
Nii et laadige server (mida tuleb seadistada) PXE kaudu. Meenutame, kuidas see toimib:
- Serveris on valitud võrgust laadimine.
- Server loads the PXE-ROM of the network card and contacts the installation server via DHCP to obtain a network address.
- The DHCP installation server issues the address and further boot instructions via PXE.
- The server loads the network boot loader from the installation server via PXE, and the subsequent loading occurs according to the PXE configuration file.
- Loading takes place based on the received parameters (kernel, initramfs, mount points, squashfs image, etc.).
Note: The article describes PXE loading via BIOS mode. Currently, manufacturers are actively implementing UEFI boot mode. For PXE, the difference will be in the DHCP server configuration 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 menuFile 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 represent an intermediate Linux image, which will be used for the primary server setup and configuration.
As you can see, the loader passes many parameters to the kernel. Some of these parameters are used by the kernel itself, while others we can use for our purposes. This will be discussed later, but for now, it's worth noting that all passed parameters will be available in the intermediate Linux image via /proc/cmdline.
Where to obtain the kernel and initramfs?
Any Linux distribution can be chosen as a base. Here’s what to consider when selecting:
- the boot image should be universal (availability of drivers, ability to install additional utilities);
- tõenäoliselt on vajalik initramfsi kohandamine.
Kuidas see on tehtud meie lahenduses X5 jaoks? Baasiks on valitud CentOS 7. Teeme järgmise triki: valmistame ette tulevase pildi struktuuri, pakime selle arhiivi ja loome initramfsi, mille sees on meie failisüsteemi arhiiv. Pildi käivitamisel arhiiv puhastatakse loomisel tmpfs ja seega saadakse minimaalne, kuid täisfunktsionaalne Linuxi live-pilt kõigi 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 tuuma ja initramfsi, mis tuleb laadida. Selle tulemusena, laadides vahepealse Linuxi pildi PXE kaudu, saame OS konsooli.
Suurepärane, kuid nüüd tuleb edasi anda juhtimine meie “automaatikale”.
Seda saab teha järgmiselt.
Oletame, et pärast pildi laadimist plaanime juhtimise edasi anda skriptile mount.sh.
Lisame skripti mount.sh automaatse käivitamise. Selleks tuleb modifitseerida initramfsi:
- lahendada initramfs (kui kasutame ülalmainitud initramfsi versiooni, ei ole see vajalik)
- lisada automaatse käivitamise kood, mis analüüsib edasi antud parameetreid läbi /proc/cmdline ja edastab juhtimise edasi;
- pakendada initramfs.
Märkus. X5 tööriistakomplekti puhul antakse laadimise juhtimine üle skriptile. /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)
Nii laaditakse pilt, mille automaatse käivitamise korral käivitub skript mount.sh. Edasi analüüsib skript mount.sh käivitamise käigus edastatud parameetreid (script_cmd=) ja käivitab vajaliku programmi/skripti.
silt toolkit-auto
tuuma ...
lisa ... nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh
silt toolkit-käsurea tõlgendus
tuuma ...
lisa ... nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Siin vasakul on PXE-menüü, paremal - juhtimise edastamise skeem.
Oleme juhtimise edastamisega kursis. Sõltuvalt PXE-menüüst käivitub kas automaatse seadistamise skript või tõrkeotsingu konsool.
Automaatse seadistamise korral monteeritakse vajalikud kataloogid installiserverist, milles on:
- skripte;
- salvestatud BIOS/UEFI mallid erinevate serverite jaoks;
- firmwares;
- serveri utiliidid;
- logid.
Edasi edastab skript mount.sh juhtimise skriptile master-install.sh skriptide kataloogist.
Skriptide puu (käivitamise järjekord) näeb välja umbes nii:
- master-install
- sharefunctions (üldfunktsioonid)
- info (teabe väljund)
- mudelid (installimise parameetrite seadmine serveri mudeli alusel)
- prepare_utils (vajalike utiliidide seadmine)
- fwupdate (firmware'i värskendamine)
- diag (alustav diagnostika)
- biosconf (BIOS/iUEFI seadistamine)
- clockfix (emaplaadi aja seadistamine)
- srmconf (eemalseadme liidese seadistamine)
- raidconf (loogiliste mahutite seadistamine)
üks järgmistest:
- preinstall (ühendamise juhtimise edastamine OS või hüpervisiitori installijale, näiteks ESXi)
- merged-install (otsemoodul pildifaili lahti pakkimiseks)
Nüüd me teame:
- kuidas käivitada serverit PXE kaudu;
- kuidas edastada juhtimist oma skriptile.
Jätkame. Olulised küsimused on:
- Kuidas tuvastada serverit, mille me ette valmistame?
- Milliste utiliitide ja kuidas seadistada serverit?
- Kuidas saada konkreetse serveri seadistusi?
Kuidas tuvastada serverit, mille me ette valmistame?
See on lihtne – DMI:
dmidecode –s system-product-name
dmidecode –s system-manufacturer
dmidecode –s system-serial-numberSiit leiate kõik, mis vajalik: tootja, mudel, seerianumber. Kui te pole kindel, et see informatsioon on kõigil serveritel olemas, võite need tuvastada MAC-aadressi põhjal. Võite kasutada ka mõlemat meetodit, kui serverite tootjad on erinevad ja mõnel mudelil puudub seerianumber.
Saadud teabe põhjal mountitakse installiserverist võrgu kaustad ja laaditakse kõik vajalikud (utiliidid, firmad ja muu).
Milliste utiliitide ja kuidas seadistada serverit?
Esitan mõnede tootjate Linuxi utiliidid. Kõik utiliidid on saadaval tootjate ametlikelt veebilehtedelt.

Ma arvan, et firmadega on kõik selge. Need tarnitakse tavaliselt pakendatud käivitatavate failidena. Käivitatav fail kontrollib firmavärskendamise protsessi ja teatab tagastuskoodi.
BIOS ja IPMI seadistatakse tavaliselt mallide kaudu. Vajadusel saab malli redigeerida enne käivitamist.
Mõned tootjate RAID utiliidid saavad ka seadistada mallide kaudu. Kui see ei kehti, tuleb kirjutada seadistusskript.
RAID seadistamise järjestus on sageli järgmine:
- Küsime praeguse konfiguratsiooni.
- Kui loogilised massiivid on juba olemas – kustutame need.
- Vaadake, millised füüsilised kettad on olemas ja kui palju neid on.
- Loome uue loogilise massiivi. Katkestame protsessi vigade korral.
Kuidas saada konkreetse serveri seadistusi?
Eeldame, et kõigi serverite seadistused salvestatakse installiserverisse. Sel juhul, et vastata meie küsimusele, tuleb kõigepealt otsustada, kuidas seadistused edastada installiserverisse.
Alguses saab täiesti piirduda tekstifailidega. (Tulevikus võib teksti faili kasutada seadistuste edastamiseks varundusmeetodina).
Saame jagada tekstifaili installatsiooniserveris. Ja lisada selle monteerimise skripti mount.sh.
Read võivad olla näiteks järgmiste nägudega:
Need read edastab insener oma töömasinast faili. Ja seejärel konfigureeritakse serveri jaoks kindlad parameetrid failist.
Kuid tulevikus oleks parem kasutada andmebaasi seadistuste, olekute ja serveri installatsiooni logide salvestamiseks.
Kuid pelgalt andmebaasist ei piisa, vajalik on luua kliendipool, millega seadeid andmebaasi edastatakse. Selle rakendamine on keerulisem võrreldes tekstifailiga, kuid tegelikult pole see nii keeruline, nagu tundub. Minimaalne klient, mis lihtsalt edastab andmeid andmebaasi, on täiesti võimalik ise kirjutada. Ja klientprogrammi saab tulevikus täiustada vabamere režiimis (aruanded, etikettide printimine, teavituste saatmine ja muu, mis pähe tuleb).
Tehes andmebaasi teatud päringu ja näidates serveri seerianumbrit, saame vajalikud parameetrid serveri seadistamiseks.
Lisaks ei pea me välja mõtlema lukustusi samaaegse ligi pääsu jaoks, nagu see on tekstifailiga.
Seadistuste ajalugu saame igas etapis salvestada andmebaasi ja installimise protsessi kontrollida sündmuste ja etappide lipude kaudu.
Nüüd teame, kuidas:
- serverit PXE kaudu käivitada;
- edastada juhtimine meie skriptile;
- tuvastada server, mida valmistada, seerianumbri kaudu;
- konfigureerida server sobivate utiliitidega;
- edastada seadistusi installatsiooniserveri andmebaasi kliendi osa kaudu.
Selgitasime, kuidas:
- installitav server saab vajalikud seadistused andmebaasist;
- kogu ettevalmistuse edenemine fikseeritakse andmebaasis (logid, sündmused, etappide lipud).
Kuidas on lood erinevate installitavate tarkvarade tüüpidega? Kuidas installida hüperviisor, kopeerida VM ja kõike seda seadistada?
Kohandatud failisüsteemi (linux) kujutise juurutamisel riistvarale on kõik üsna lihtne:
- Pärast kõigi serveri komponentide seadistamist juurutame kujutise.
- Paigaldame käivitusprogrammi grub.
- Teeme chroot ja seadistame kõik, mis vajalik.
Kuidas edastada juhtimine operatsioonisüsteemi installijale (ESXi näitel).
- Korraldame juhtimise edastamise meie skriptist hüperviisori installijale vastuste failist (kickstart):
- Kustutame hetke ketta partitsioonid.
- Loome partitsiooni suurusega 500MB.
- Märkime selle käivitamiseks.
- Formateerime FAT32-sse.
- Kopeerime selle juurkausta ESXi installifailid.
- Installime syslinux'i.
- 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.
Pärast serveri taaskäivitamist selle kõvakettalt laadib ESXi installer. Kõik vajalikud installifailid laaditakse mällu ja seejärel algab ESXi paigaldamine vastavalt antud vastuste failile.
Toon siin välja mõned read automaatvastuste failist ks_esxi.cfg:
%firstboot --interpreter=busybox
…
# saame seerianumber
SYSSN=$(esxcli hardware platform get | grep Serial | awk -F " " '{print $3}')
# saame IP
IPADDRT=$(esxcli network ip interface ipv4 get | grep vmk0 | awk -F " " '{print $2}')
LAST_OCTET=$(echo $IPADDRT | awk -F'.' '{print $4}')
# ühendame NFS install-server
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 hetkel VM-i juurutamiseks, lisaks võib see hiljem kasulik olla
cp -R /vmfs/volumes/nfsshare1/ovftool /vmfs/volumes/datastore1/
# juurutame VM-i
/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 seadetega
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 seadistamise skripti
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 parameetri guestinfo.esxihost.id, seadistame seerianumbriks
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM1/VM1.vmx
echo "guestinfo.esxihost.id = "$SYSSN"" >> /vmfs/volumes/datastore1/VM2/VM2.vmx
...
# värskendame teavet andmebaasis
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 ...""
# tagastame 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
Sel hetkel on hüperviisor installitud ja seadistatud, virtuaalmasinad on kopeeritud.
Kuidas nüüd virtuaalmasinaid seadistada?
Oleme veidi petnud: installimise ajal määrasime parameetri guestinfo.esxihost.id = "$SYSSN" failis VM1.vmx, seades selle füüsilise serveri seerianumbriks.
Nüüd, pärast virtuaalmasina käivitamist (vmware-tools pakett installitud), saab sellele parameetrile juurde pääseda:
ESXI_SN=$(vmtoolsd --cmd "info-get guestinfo.esxihost.id")See, the VM will be able to identify itself (it knows the serial number of the physical host), make a request to the install server's database, and retrieve the parameters that need to be configured. All this is wrapped in a script that should be automatically run at the start of the guestos VM (but only once: RunOnce).
Nüüd teame, kuidas:
- serverit PXE kaudu käivitada;
- edastada juhtimine meie skriptile;
- tuvastada server, mida valmistada, seerianumbri kaudu;
- configure the server with the necessary utilities;
- transfer settings to the install server's database using the client part;
- configure different types of software, including deploying the ESXi hypervisor and configuring virtual machines (and do it all automatically).
Selgitasime, kuidas:
- installitav server saab vajalikud seadistused andmebaasist;
- kogu ettevalmistuse edenemine fikseeritakse andmebaasis (logid, sündmused, etappide lipud).
Conclusion:
I believe the uniqueness of this solution lies in its flexibility, simplicity, capabilities, and versatility.
Please write in the comments what you think.
Allikas: habr.com
