Tee-seda-ise paljasmetalli pakkumine ehk serverite automaatne ettevalmistamine nullist

Tere, mina olen Denis ja üks minu tegevusvaldkondi on X5 taristulahenduste arendamine. Täna tahaksin teiega jagada, kuidas saate juurutada automaatse serveri ettevalmistamise süsteemi, mis põhineb avalikult kättesaadavatel tööriistadel. Minu arvates on see huvitav, lihtne ja paindlik lahendus.

Tee-seda-ise paljasmetalli pakkumine ehk serverite automaatne ettevalmistamine nullist

Ettevalmistuse all peame silmas: muutke uus server karbist välja OS-iga täielikult konfigureeritud serveriks. Linux või ESXi hüperviisoriga (Windowsi serverite juurutamist selles artiklis ei käsitleta).

Tingimused:

  • serverid – konfigureerimist vajavad serverid.
  • installiserver on peamine server, mis tagab kogu ettevalmistusprotsessi võrgu kaudu.

Miks on vaja automatiseerimist?

Oletame, et on ülesanne: valmistada serverid massiliselt nullist ette, tipphetkel - 30 päevas. Neisse võivad olla installitud erinevate tootjate ja mudelite serverid, erinevad operatsioonisüsteemid, millel võib olla hüperviisor, aga ka mitte.

Millised toimingud on häälestusprotsessis (ilma automatiseerimiseta):

  • ühendage serveriga klaviatuur, hiir, monitor;
  • konfigureerige BIOS, RAID, IPMI;
  • värskendage komponendi püsivara;
  • juurutage failisüsteemi kujutis (või installige hüperviisor ja kopeerige virtuaalmasinaid);

Märge. Teise võimalusena on OS-i juurutamine võimalik automaatvastuse failiga installimise kaudu. Kuid seda artiklis ei käsitleta. Kuigi allpool näete, et selle funktsiooni lisamine pole keeruline.

  • OS-i parameetrite (hostinimi, IP jne) seadistamine.

Selle lähenemisviisi korral tehakse igas serveris järjestikku samad sätted. Sellise töö efektiivsus on väga madal.

Automatiseerimise olemus seisneb inimeste osaluse välistamises serveri ettevalmistamise protsessis. Nii palju kui võimalik.

Automatiseerimine vähendab seisakuid toimingute vahel ja võimaldab varustada mitut serverit samaaegselt. Samuti väheneb oluliselt inimteguritest tingitud vigade tõenäosus.

Tee-seda-ise paljasmetalli pakkumine ehk serverite automaatne ettevalmistamine nullist

Kuidas servereid automaatselt konfigureeritakse?

Analüüsime üksikasjalikult kõiki etappe.

Teil on Linuxi server, mida kasutate PXE installiserverina. Sellele on installitud ja konfigureeritud teenused: DHCP, TFTP.

Niisiis, käivitame serveri (mis tuleb konfigureerida) PXE kaudu. Meenutagem, kuidas see töötab:

  • Serveris on valitud võrgu alglaadimine.
  • Server laadib võrgukaardi PXE-ROM-i ja võtab võrguaadressi saamiseks ühendust installiserveriga DHCP kaudu.
  • DHCP installiserver väljastab aadressi ja juhised edasiseks allalaadimiseks PXE kaudu.
  • Server laadib võrgu alglaaduri installiserverist PXE kaudu, edasine laadimine toimub vastavalt PXE konfiguratsioonifailile.
  • Alglaadimine toimub saadud parameetrite (kernel, initramfs, mount point, squashfs pilt jne) alusel.

Märge. Artiklis kirjeldatakse PXE kaudu käivitamist BIOS-i režiimi kaudu. Praegu rakendavad tootjad aktiivselt UEFI alglaadimisrežiimi. PXE puhul on erinevus DHCP-serveri konfiguratsioonis ja täiendava alglaaduri olemasolus.

Vaatame näidet PXE-serveri konfiguratsioonist (pxelinuxi menüü).

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

Fail 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 ja initramfs on selles etapis vahepealne Linuxi pilt, mille abil toimub serveri põhiline ettevalmistus ja seadistamine.

Nagu näete, edastab alglaadur kernelile palju parameetreid. Mõnda neist parameetritest kasutab kernel ise. Ja me saame mõnda oma eesmärkidel kasutada. Seda arutatakse hiljem, kuid praegu võite lihtsalt meeles pidada, et kõik läbitud parameetrid on saadaval Linuxi vahepealses pildis /proc/cmdline kaudu.

Kust neid saada, kernel ja initramfs?
Aluseks saate valida mis tahes Linuxi distributsiooni. Millele me valimisel tähelepanu pöörame:

  • alglaadimispilt peab olema universaalne (draiverite saadavus, võimalus installida täiendavaid utiliite);
  • Tõenäoliselt peate initramfsi kohandama.

Kuidas seda meie X5 lahenduses tehakse? Aluseks sai valitud CentOS 7. Proovime järgmist nippi: valmistada ette tulevane pildistruktuur, pakkida see arhiivi ja luua initramfs, mille sees asub meie failisüsteemi arhiiv. Pildi laadimisel laiendatakse arhiiv loodud tmpfs partitsiooni. Nii saame minimaalse, kuid täisväärtusliku linuxi reaalajas pildi koos kõigi vajalike utiliitidega, mis koosneb ainult 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.gz

Seega oleme määranud kerneli ja initramfi, mis tuleks laadida. Selle tulemusena saame selles etapis, laadides PXE kaudu linuxi vahepealse pildi, OS-i konsooli.

Suurepärane, kuid nüüd peame juhtimise üle andma oma "automaatikale".

Seda saab teha nii.

Oletame, et pärast pildi laadimist plaanime juhtimise üle anda skriptile mount.sh.
Kaasame skripti mount.sh automaatkäivitusse. Selleks peate muutma initramfsi:

  • pakkige initramfs lahti (kui kasutame ülaltoodud suvandit initramfs, pole see vajalik)
  • lisage käivitamisel kood, mis analüüsib /proc/cmdline kaudu edastatud parameetreid ja edastab juhtimise edasi;
  • pakkida initramfs.

Märge. X5 tööriistakomplekti puhul kantakse laadimise juhtimine üle skriptile /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Niisiis laaditakse pilt, milles mount.sh skript algab automaatkäivitamisega. Järgmiseks analüüsib skript mount.sh täitmise käigus läbitud parameetreid (script_cmd=) ja käivitab vajaliku programmi/skripti.

sildi tööriistakomplekt-auto
kernel...
lisa... nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

sildi tööriistakomplekt-koor
kernel...
lisa... nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Tee-seda-ise paljasmetalli pakkumine ehk serverite automaatne ettevalmistamine nullist

Siin vasakul on PXE menüü, paremal on juhtimisülekande skeem.

Me mõtlesime välja kontrolli üleandmise. Olenevalt PXE menüü valikust käivitatakse kas automaatse konfiguratsiooni skript või silumiskonsool.

Automaatse konfigureerimise korral monteeritakse installiserverist vajalikud kataloogid, mis sisaldavad:

  • skriptid;
  • salvestatud BIOS/UEFI mallid erinevatele serveritele;
  • püsivara;
  • serveri utiliidid;
  • palgid

Järgmisena annab skript mount.sh juhtimise üle skriptikataloogist skriptile master-install.sh.

Skriptipuu (nende käivitamise järjekord) näeb välja umbes selline:

  • master-install
  • jagamisfunktsioonid (jagatud funktsioonid)
  • info (teabe väljund)
  • mudelid (installiparameetrite seadistamine serveri mudeli alusel)
  • ready_utils (vajalike utiliitide paigaldamine)
  • fwupdate (püsivara värskendus)
  • diag (elementaarne diagnostika)
  • biosconf (BIOS/UEFI seaded)
  • kellafiksaator (kellaaja seadistamine emaplaadil)
  • srmconf (kaugliidese liidese konfiguratsioon)
  • raidconf (loogiliste mahtude seadistamine)

üks järgmistest:

  • eelinstallimine (juhtimise ülekandmine operatsioonisüsteemile või hüperviisori installiprogrammile, näiteks ESXi)
  • Merged-install (pildi lahtipakkimise kohene algus)

Nüüd me teame:

  • kuidas serverit PXE kaudu käivitada;
  • kuidas juhtimine oma skriptile üle anda.


Jätkame. Asjakohaseks said järgmised küsimused:

  • Kuidas teha kindlaks serveri, mida me valmistame?
  • Millised utiliidid ja kuidas serverit konfigureerida?
  • Kuidas saada seadeid konkreetse serveri jaoks?

Kuidas teha kindlaks serveri, mida me valmistame?

See on lihtne – DMI:

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

Siin on kõik vajalik: müüja, mudel, seerianumber. Kui te pole kindel, et see teave on kõigis serverites olemas, saate need tuvastada nende MAC-aadressi järgi. Või mõlemal viisil korraga, kui serveri müüjad on erinevad ja mõnel mudelil seerianumbri kohta lihtsalt info puudub.

Saadud teabe põhjal monteeritakse installiserverist võrgukaustad ja kõik vajalik laaditakse (utiliidid, püsivara jne).

Millised utiliidid ja kuidas serverit konfigureerida?

Pakun mõnedele tootjatele Linuxi jaoks utiliite. Kõik kommunaalteenused on saadaval tarnijate ametlikel veebisaitidel.

Tee-seda-ise paljasmetalli pakkumine ehk serverite automaatne ettevalmistamine nullist

Püsivaraga on minu arvates kõik selge. Tavaliselt on need pakitud käivitatavate failidena. Käivitatav fail juhib püsivara värskendamise protsessi ja teatab tagastuskoodi.

BIOS ja IPMI konfigureeritakse tavaliselt mallide kaudu. Vajadusel saab malli enne allalaadimist redigeerida.

Mõne tarnija RAID-utiliite saab konfigureerida ka malli abil. Kui see nii ei ole, peate kirjutama konfiguratsiooniskripti.

RAID-i seadistamise protseduur on enamasti järgmine:

  • Nõuame praegust konfiguratsiooni.
  • Kui loogilisi massiive on juba olemas, kustutame need.
  • Vaatame, millised füüsilised kettad on olemas ja kui palju neid on.
  • Looge uus loogiline massiiv. Vea korral katkestame protsessi.

Kuidas saada seadeid konkreetse serveri jaoks?

Oletame, et kõigi serverite sätted salvestatakse installiserverisse. Sellisel juhul peame meie küsimusele vastamiseks kõigepealt otsustama, kuidas sätted installiserverisse üle kanda.

Alguses saate tekstifailidega hakkama. (Tulevikus soovite võib-olla kasutada seadete ülekandmiseks varumeetodina tekstifaili.)

Saate installiserveris tekstifaili "jagada". Ja lisage selle kinnitus skriptile mount.sh.

Jooned näevad näiteks välja järgmised:

<seerianumber> <hostinimi> <alamvõrk>

Need read kannab insener oma töömasinalt faili. Ja siis serveri seadistamisel loetakse failist konkreetse serveri parameetrid.

Kuid pikemas perspektiivis on serveri installimiste sätete, olekute ja logide salvestamiseks parem kasutada andmebaasi.

Muidugi ei piisa ainult andmebaasist ja tuleb luua kliendiosa, mille abil sätted andmebaasi üle kantakse. Seda on tekstifailiga võrreldes keerulisem rakendada, kuid tegelikult pole kõik nii keeruline, kui tundub. On täiesti võimalik kirjutada kliendi minimaalne versioon, mis lihtsalt edastab andmed ise andmebaasi. Ja edaspidi on võimalik kliendiprogrammi täiendada vabarežiimis (aruanded, siltide printimine, teadete saatmine jne, mis pähe tuleb).

Tehes andmebaasile konkreetse päringu ja määrates serveri seerianumbri, saame serveri seadistamiseks vajalikud parameetrid.

Lisaks ei pea me üheaegseks juurdepääsuks lukke välja pakkuma, nagu tekstifaili puhul.

Konfiguratsioonilogi saame kirjutada andmebaasi kõikides etappides ja paigaldusprotsessi juhtida ettevalmistusetappide sündmuste ja lippude kaudu.

Nüüd teame, kuidas:

  • käivitage server PXE kaudu;
  • viige juhtimine üle meie skriptile;
  • identifitseerida server, mis vajab ettevalmistamist selle seerianumbri järgi;
  • konfigureerige server sobivate utiliitide abil;
  • teisaldage seaded kliendiosa abil installiserveri andmebaasi.

Saime teada, kuidas:

  • installitud server saab andmebaasist vajalikud seadistused;
  • kogu ettevalmistuse käik salvestatakse andmebaasi (logid, sündmused, etapi lipud).

Kuidas on lood teie installitud erinevat tüüpi tarkvaraga? Kuidas installida hüperviisorit, kopeerida VM-i ja seda kõike konfigureerida?

Failisüsteemi kujutise (linux) riistvarale juurutamisel on kõik üsna lihtne:

  • Pärast kõigi serverikomponentide seadistamist juurutame pildi.
  • Installige grubi alglaadur.
  • Me chrootime ja konfigureerime kõik vajaliku.

Juhtimise ülekandmine OS-i installijale (kasutades näitena ESXi).

  • Korraldame juhtimise ülekandmise meie skriptilt hüperviisori installijale automaatse vastuse faili (kickstart) abil:
  • Kustutame kettalt praegused partitsioonid.
  • Looge partitsioon suurusega 500 MB.
  • Märgime selle käivitatavaks.
  • Vorminda FAT32-ks.
  • Kopeerime ESXi installifailid juurjuurde.
  • Syslinuxi installimine.
  • Kopeerige syslinux.cfg kausta /syslinux/

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

  • Kopeerige mboot.c32 asukohta /syslinux.
  • Boot.cfg peaks olema kernelopt=ks=ftp:// /ks_esxi.cfg
  • Taaskäivitame serveri.

Pärast serveri taaskäivitamist laadib ESXi installer serveri kõvakettalt alla. Kõik vajalikud installifailid laaditakse mällu ja seejärel algab ESXi installimine vastavalt määratud automaatvastuse failile.

Siin on mõned read automaatvastuse failist 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

Selles etapis installitakse ja konfigureeritakse hüperviisor ning virtuaalsed masinad kopeeritakse.

Kuidas nüüd virtuaalmasinaid konfigureerida?

Me petsime veidi: installimise ajal määrasime failis VM1.vmx parameetri guestinfo.esxihost.id = "$SYSSN" ja märkisime selles oleva füüsilise serveri seerianumbri.

Nüüd, pärast käivitamist, pääseb virtuaalmasin (millega on installitud pakett vmware-tools) sellele parameetrile juurde pääseda:

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

See tähendab, et VM suudab end tuvastada (teab füüsilise hosti seerianumbrit), teha päringu installiserveri andmebaasile ja saada konfigureerimist vajavaid parameetreid. See kõik on kompileeritud skriptiks, mis tuleks guestos vm käivitumisel automaatselt käivitada (kuid üks kord: RunOnce).

Nüüd teame, kuidas:

  • käivitage server PXE kaudu;
  • viige juhtimine üle meie skriptile;
  • identifitseerida server, mis vajab ettevalmistamist selle seerianumbri järgi;
  • konfigureerige server sobivate utiliitide abil;
  • teisaldage seaded kliendiosa abil installiserveri andmebaasi;
  • konfigureerida erinevat tüüpi tarkvara, sealhulgas esxi hüperviisori juurutamine ja virtuaalmasinate konfigureerimine (kõik automaatselt).

Saime teada, kuidas:

  • installitud server saab andmebaasist vajalikud seadistused;
  • kogu ettevalmistuse käik salvestatakse andmebaasi (logid, sündmused, etapi lipud).


Tulemus:

Usun, et selle lahenduse ainulaadsus seisneb selle paindlikkuses, lihtsuses, võimalustes ja mitmekülgsuses.

Palun kirjutage kommentaaridesse, mida arvate.

Allikas: www.habr.com

Lisa kommentaar