Përshëndetje, unë jam Denis dhe një nga fushat e mia të aktivitetit është zhvillimi i zgjidhjeve infrastruktuore në X5. Sot do të doja të ndaja me ju se si mund të vendosni një sistem automatik të përgatitjes së serverëve mbi bazën e mjeteve publike. Mendoj se është një zgjidhje interesante, e thjeshtë dhe fleksibël.

Me përgatitjen nënkuptohet: të bëhet një server i ri nga kutia, një server plotësisht i konfiguruar me sistemin operativ Linux ose me hipervizorin ESXi (shpërndarja serverësh Windows në këtë artikull nuk diskutohet).
Terminologji:
- serverët – serverët që duhet të konfigurohen.
- install-server – serveri kryesor që siguroni të gjithë procesin e përgatitjes në rrjet.
Pse është e nevojshme automatizimi?
Lëvizni, ka një detyrë: përgatitjen masive të serverëve nga zero, në maksimum – 30 në ditë. Serverë nga prodhues dhe modele të ndryshme, mbi to mund të instalohet sisteme të ndryshme operative, mund të ketë ose të mos ketë hipervizor.
Cilat operacione përfshihen në procesin e konfigurimit (pa automatizim):
- të lidheni një tastierë, maus, monitor me serverin;
- të konfigurohet BIOS, RAID, IPMI;
- të përditësohen firmware e komponenteve;
- të vendoset imazhi i sistemit të skedarëve (ose të instalohet hipervizori dhe të kopjohen makinën virtuale);
Shënim. Si një mundësi, depolimi i OS është i mundur përmes instalimit me skedarin e përgjigjeve automatik. Por kjo nuk do të diskutohet në artikull. Megjithatë, më poshtë do të shihni se është e lehtë të shtohet ky funksionalitet.
- të konfigurohen parametrat e OS (hostname, IP, të tjera).
Me këtë qasje, kryhen të njëjtat konfigurime në mënyrë sëndesh për çdo server. Efikasiteti i një pune të tillë është shumë i ulët.
Essenca e automatizimit është përjashtimi i pjesëmarrjes së njeriut nga procesi i përgatitjes së serverit. Sa më shumë që është e mundur.
Falë automatizimit, reduktohet koha e papunësisë midis operacioneve dhe krijohet mundësia për të përgatitur disa serverë në të njëjtën kohë. Po ashtu, ul shumë probabilitetin e shfaqjes së gabimeve për shkak të faktorëve njerëzorë.

Si ndodh konfigurimi automatik i serverëve?
Do të analizojmë çdo fazë në detaje.
Keni një server linux që e përdorni si PXE install-server. Në të janë instaluar dhe konfiguruar shërbimet: DHCP, TFTP.
Pra, ngarkoni serverin (që duhet të konfigurohet) përmes PXE. Le ta kujtojmë si funksionon:
- Në server është zgjedhur ngarkimi përmes rrjetit.
- Server loads the PXE-ROM of the network card and connects to the install server via DHCP to obtain a network address.
- The DHCP install server issues the address and instructions for further loading via PXE.
- The server loads the network loader from the install server via PXE, and further loading occurs according to the PXE configuration file.
- Loading occurs based on the received parameters (kernel, initramfs, mount points, squashfs image, etc.).
Note: This article describes loading via PXE through BIOS mode. 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 of PXE server configuration (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 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="…"The kernel and initramfs at this stage 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 we can use for our purposes. This will be explained further, but for now, just remember that all passed parameters will be available 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);
- ndoshta do të nevojitet të personalizojmë initramfs.
Si është bërë kjo në zgjidhjen tonë për X5? Si bazë është zgjedhur CentOS 7. Do të realizojmë këtë truk: do të përgatisim strukturën e ardhshme të imazhit, do ta paketojmë atë në një arkiv dhe do të krijojmë initramfs, brenda të cilit do të jetë arkivi i sistemit të skedhave. Gjatë ngarkimit të imazhit, arkivi do të deshifrohet në ndarjen e krijuar tmpfs. Në këtë mënyrë, do të arrijmë një imazh minimal live linux me të gjitha utilitetet e nevojshme, përbërë nga vetëm dy skedha: vmkernel dhe 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.gzPra, ne specifikuam bërthamën dhe initramfs që duhet të ngarkohen. Si rezultat, në këtë fazë, duke ngarkuar imazhin e përkohshëm linux përmes PXE, do të marrim konsolën e OS.
Shumë mirë, por tani duhet të kalojmë kontrollin tek “automatizimi” ynë.
Kjo mund të bëhet kështu.
Supozoni se, pas ngarkimit të imazhit, ne planifikojmë të kalojmë kontrollin në skenarin mount.sh.
Do ta përfshijmë skenarin mount.sh në autostart. Për këtë do të duhet të modifikojmë initramfs:
- të deshifrojmë initramfs (nëse përdorim variantin e lartpërmendur të initramfs, nuk është e nevojshme)
- të përfshijmë në autostart kodin që do të analizojë parametrat e kaluara përmes /proc/cmdline dhe do të kalojë kontrollin më tej;
- të paketojmë initramfs.
Shënim. Në rastin e X5 toolkit, kontrolli i ngarkimit kalon në skenarin /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)
Pra, ngarkohet imazhi, në të cilin në autostart fillon skenari mount.sh. Më pas, skenari mount.sh gjatë ekzekutimit analizë parametrat e kaluara (script_cmd=) dhe ekzekuton programin/skedarin e nevojshëm.
etiketa toolkit-auto
bërthama …
shtojca … nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh
etiketa toolkit-shell
bërthama …
shtojca … nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Këtu në anën e majtë - menuja PXE, në anën e djathtë - skema e kalimit të kontrollit.
Me kalimin e kontrollit ne jemi të qartë. Në varësi të zgjedhjes në menu PXE, startohet ose skenari i automatikës, ose konsola për debugim.
Në rast të konfigurimit automatik, montohen direktorët e nevojshme nga instalimi, në të cilat gjenden:
- skenarët;
- shabllonat e ruajtura BIOS/UEFI të serverëve të ndryshëm;
- firmware;
- utilitetet për serverët;
- log-et.
Më pas skenari mount.sh kalon kontrollin tek skenari master-install.sh nga direktoria që përmban skenaret.
Struktura e skenareve (renditja e ekzekutimit) duket kështu:
- master-install
- sharefunctions (funksione të përbashkëta)
- info (dalja e informacionit)
- modelet (vendosja e parametrave të instalimit në bazë të modelit të serverit)
- prepare_utils (instalimi i utiliteteve të nevojshme)
- fwupdate (përditësimi i firmware)
- diag (diagnoza elementare)
- biosconf (konfigurimi i BIOS/UEFI)
- clockfix (konfigurimi i kohës në pllakën e nënës)
- srmconf (konfigurimi i ndërfaqes së qasjes në distancë)
- raidconf (konfigurimi i volume-ve logjike)
një nga:
- preinstall (kallimi i kontrollit te instaluesi i OS-së ose hipervizorit, për shembull ESXi)
- merged-install (nisja e drejtpërdrejtë e zhbllokimit të imazhit)
Tani e dimë:
- si të ngarkohet serveri përmes PXE;
- si të transferohet kontrolli në skenarin tonë.
Të vazhdojmë. Këto pyetje janë bërë aktuale:
- Si të identifikojmë serverin që po përgatitim?
- Me cilat mjete dhe si ta konfigurojmë serverin?
- Si të marrim konfigurimet për serverin specifik?
Si të identifikojmë serverin që po përgatitim?
Kjo është e thjeshtë – DMI:
dmidecode –s system-product-name
dmidecode –s system-manufacturer
dmidecode –s system-serial-numberKëtu ka gjithçka që nevojitet: prodhuesi, modeli, numri serial. Nëse nuk jeni të sigurt se kjo informacion është prezent në të gjitha serverat, mund t'i identifikoni ato me adresën MAC. Ose, të dy mënyrat për njëkohësisht, nëse prodhuesit e serverëve janë të ndryshëm dhe në disa modele informacioni mbi numrin serial është thjesht i munguar.
Në bazë të informacionit të marrë, montohen dosjet rrjetësore nga serveri i instalimeve dhe ngarkohet gjithçka e nevojshme (mjete, firmware dhe të tjera).
Me cilat mjete dhe si ta konfigurojmë serverin?
Do të jap mjete për linux për disa prodhues. Të gjitha mjetet janë të disponueshme në faqet zyrtare të prodhuesve.

Me firmware, mendoj se të gjitha janë të qarta. Zakonisht, ato ofrohen si skedarë ekzekutivë të paketuar. Skedari ekzekutiv kontrollon procesin e përditësimit të firmware dhe raporton kodin e kthimit.
BIOS dhe IPMI zakonisht konfigurohen përmes shablloneve. Nëse është e nevojshme, shablloni mund të redaktohet para ngarkimit të vetë.
Mjetet RAID nga disa prodhues gjithashtu mund të konfigurohen në bazë të shablloneve. Nëse kjo nuk është kështu, atëherë do të duhet të shkruani një skenar konfigurimi.
Renditja e konfigurimit të RAID zakonisht është si më poshtë:
- Kërkojmë konfigurimin aktual.
- Nëse tashmë ekzistojnë volumet logjike – i fshijmë.
- Shikojmë se cilat disqe fizike janë të pranishme dhe sa janë.
- Krijojmë një volum të ri logjik. Ndërpresim procesin në rast të gabimit.
Si të marrim konfigurimet për serverin specifik?
Supozoni se konfigurimet e të gjithë serverëve do të ruhen në serverin e instalimeve. Në këtë rast, për të përgjigjur në pyetjen tonë, først duhet të vendosim: si do të kalojmë konfigurimet në serverin e instalimeve.
Në fillim, është mjaft e mundur të përballesh me skedarët tekstualë. (Në të ardhmen, mund të përdorësh skedarin tekst si një mënyrë rezervë për të transferuar cilësimet).
Mund të "ndash" një skedar tekstual në serverin e instalimit. Dhe të shtosh montimin e tij në skenarin mount.sh.
Radhët do të jenë, për shembull, të këtij lloji:
Këto radhë do të dërgohen në skedar nga inxhinieri nga makina e tij e punës. Dhe më pas, gjatë konfigurimit të serverit, parametrat për serverin specifik do të lexohen nga skedari.
Por, në perspektivë, është më mirë të përdoret një DB për ruajtjen e cilësimeve, gjendjeve dhe regjistrimeve të instalimeve të serverëve.
Sigurisht, nuk mjafton një DB, dhe do të nevojitet të krijohet një pjesë klienti, me ndihmën e të cilës do të dërgohen cilësimet në bazë. Zbatimi i kësaj është më i komplikuar, në krahasim me skedarin tekst, por, në të vërtetë, gjithçka nuk është aq e vështirë sa duket. Një version minimal të klientit, i cili do të dërgojë thjesht të dhëna në DB, është plotësisht e mundur ta shkruash vetë. Dhe përmirësimi i programit klient në të ardhmen mund të bëhet gjithashtu në një mënyrë të lirë (raporte, printimi i etiketimeve, dërgimi i njoftimeve dhe gjithçka tjetër që mund të vijë në mendje).
Duke bërë një kërkesë të caktuar në bazë dhe duke treguar numrin e serisë së serverit, do të marrim parametrat e nevojshëm për konfigurimin e serverit.
Plus, nuk do të na duhet të gjejmë bllokime për qasje të njëkohshme, si në rastin e skedarit tekst.
Regjistri i konfigurimit mund ta shkruajmë në çdo hap në DB dhe procesin e instalimit ta kontrollojmë përmes ngjarjeve dhe flamujve të hapave të përgatitjes.
Tani dimë se si:
- të ngarkojmë serverin përmes PXE;
- të kalojmë kontrollin në skenarin tonë;
- të identifikojmë serverin që duhet të përgatitet, sipas numrit të serisë;
- të konfigurojmë serverin me mjete përkatëse;
- të dërgojmë cilësimet në DB të serverit të instalimit me ndihmën e pjesës klient.
Kemi zbuluar se si:
- serveri që po instalohet merr cilësimet e nevojshme nga DB;
- të gjithë progresi i përgatitjes regjistrohet në DB (log, ngjarje, flamuj të hapave).
Çfarë ndodh me llojet e ndryshme të softuerit që po instalohet? Si të instalosh hypervisor, të kopjosh VM dhe të konfigurosh të gjitha këto?
Në rastin e shpërndarjes së imazhit të skedarit të sistemit (linux) në harduer, gjithçka është mjaft e thjeshtë:
- Pas konfigurimit të të gjithë komponentëve të serverit, shpërndajmë imazhin.
- Instalojmë bootloader-in grub.
- Krijojmë chroot dhe konfigurimin e gjithçkaje të nevojshme.
Si të transferoni kontrollin në instaluesin e OS-së (me shembullin e ESXi).
- Organizojmë transferimin e kontrollit nga skripti ynë në instaluesin e hipervizorit përmes skedarit të përgjigjeve automatike (kickstart):
- Fshijmë partitions aktuale në disk.
- Krijojmë një partition me madhësi 500MB.
- E shënojmë atë si të ngarkueshëm.
- E formatizojmë në FAT32.
- Kopjojmë skedarët instalues të ESXi në rrënjën e tij.
- Instalojmë syslinux.
- Kopjojmë syslinux.cfg në /syslinux/
default esxi
prompt 1
timeout 50
label esxi
kernel mboot.c32
append -c boot.cfg- Kopjojmë mboot.c32 në /syslinux.
- Në boot.cfg duhet të jetë kernelopt=ks=ftp:///ks_esxi.cfg
- Rinisni serverin.
Pasi serveri të rinisë, instaluesi i ESXi do të ngarkohet nga disku i tij i fortë. Të gjithë skedarët e nevojshëm të instaluesit do të ngarkohen në kujtesë dhe më pas do të fillojë instalimi i ESXi, sipas skedarit të specifikuar të përgjigjeve automatike.
Do të paraqes disa rreshta nga skedari i përgjigjeve automatike ks_esxi.cfg:
%firstboot --interpreter=busybox
…
# marrim numrin e serialit
SYSSN=$(esxcli hardware platform get | grep Serial | awk -F " " '{print $3}')
# marrim IP-n
IPADDRT=$(esxcli network ip interface ipv4 get | grep vmk0 | awk -F " " '{print $2}')
LAST_OCTET=$(echo $IPADDRT | awk -F'.' '{print $4}')
# lidhim serverin NFS për instalim
esxcli storage nfs add -H is -s \/srv\/nfs_share -v nfsshare1
# kopjojmë cilësimet përkatëse të ssh, për të përdorur klientin ssh
mv \/etc\/ssh \/etc\/ssh.tmp
cp -R \/vmfs\/volumes\/nfsshare1\/ssh \/etc\/
chmod go-r \/etc\/ssh\/ssh_host_rsa_key
# kopjojmë ovftool, për të deploy-uar VM-in tani, ndoshta do na nevojitet më vonë
cp -R \/vmfs\/volumes\/nfsshare1\/ovftool \/vmfs\/volumes\/datastore1\/
# deploy-ojmë VM-in
\/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
# marrim rreshtin me cilësimet e serverit tonë
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
...
# gjenerojmë skriptin për cilësimin e rrjetit
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
# caktuar parametri guestinfo.esxihost.id, shënojmë numrin e serialit
echo "guestinfo.esxihost.id = "$SYSSN"" >> \/vmfs\/volumes\/datastore1\/VM1\/VM1.vmx
echo "guestinfo.esxihost.id = "$SYSSN"" >> \/vmfs\/volumes\/datastore1\/VM2\/VM2.vmx
...
# përditësojmë informacionin në bazën e të dhënave
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 ...""
# kthejm cilësimet SSH
rm -rf \/etc\/ssh
mv \/etc\/ssh.tmp \/etc\/ssh
# konfigurimin e rrjetit dhe riciklimin
esxcli system hostname set --fqdn=esx-${G_NICK}.x5.ru
\/vmfs\/volumes\/datastore1\/netconf.sh
reboot
Në këtë etapë, hipervizori është instaluar dhe konfiguruar, virtualet janë kopjuar.
Si mund të konfigurojmë tani virtualet?
Ne bëmë pak mashtrim: gjatë instalimit, caktuam parametrin guestinfo.esxihost.id = "$SYSSN" në skedarin VM1.vmx, shkruam numrin e serialit të serverit fizik.
Tani, pas nisjes, makina virtuale (me paketën vmware-tools të instaluar) mund të aksesojë këtë parametrin:
ESXI_SN=$(vmtoolsd --cmd "info-get guestinfo.esxihost.id")Pra pasë mundësinë të identifikojë veten (ajo e di numrin serial të hostit fizik), bën një kërkesë në bazën e të dhënave të serverit të instalimit dhe merr parametrat që duhet të konfigurohen. Të gjithë këtë e paraqet në një skript, i cili duhet të ekzekutohet automatikisht gjatë nisjes së guestos vm (por një herë: RunOnce).
Tani dimë se si:
- të ngarkojmë serverin përmes PXE;
- të kalojmë kontrollin në skenarin tonë;
- të identifikojmë serverin që duhet të përgatitet, sipas numrit të serisë;
- të konfigurojë serverin me utilitetet përkatëse;
- të ndajë konfigurimet në bazën e të dhënave të serverit të instalimit përmes pjesës klient;
- të konfigurojë lloje të ndryshme të softuerit, përfshirë implementimin e hipervizorit esxi dhe konfigurimin e makinave virtuale (dhe gjithçka automatikisht).
Kemi zbuluar se si:
- serveri që po instalohet merr cilësimet e nevojshme nga DB;
- të gjithë progresi i përgatitjes regjistrohet në DB (log, ngjarje, flamuj të hapave).
Përfundimi:
Mendoj se unikaliteti i kësaj zgjidhjeje është fleksibiliteti, thjeshtësia, mundësitë e saj dhe universaliteti.
Ju lutem, shkruani në komentet çfarë mendoni.
Burimi: habr.com
