Provisioning Bare-Metal, o preparazione automatica di i servitori da zero

Hola, sò Denis è una di e mo aree di attività hè u sviluppu di soluzioni infrastrutturali in X5. Oghje vogliu sparte cun voi cumu pudete implementà un sistema di preparazione di u servitore automaticu basatu annantu à l'arnesi dispunibuli publicamente. In my opinion, questa hè una suluzione interessante, simplice è flexible.

Provisioning Bare-Metal, o preparazione automatica di i servitori da zero

Per preparazione vulemu dì: trasfurmà un novu servitore fora di a scatula in un servitore cumpletamente cunfiguratu cù OS. Linux o cù l'hypervisor ESXi (a implementazione di i servitori Windows ùn hè micca discututu in questu articulu).

I termini:

  • servitori - servitori chì deve esse cunfigurati.
  • u servitore di stallazione hè u servitore principale chì furnisce tuttu u prucessu di preparazione nantu à a reta.

Perchè l'automatizazione hè necessaria?

Dicemu chì ci hè un compitu: per preparà massivamente i servitori da zero, à un piccu - 30 per ghjornu. Servitori di diversi fabricatori è mudelli, diversi sistemi operativi ponu esse installati nantu à elli, è ponu o micca avè un ipervisore.

Chì operazioni sò incluse in u prucessu di stallazione (senza automatizazione):

  • cunnette un teclatu, mouse, monitor à u servitore;
  • cunfigurà BIOS, RAID, IPMI;
  • aghjurnà u firmware di i cumpunenti;
  • implementà una maghjina di u sistema di fugliale (o installate un ipervisore è copià e macchine virtuali);

Nota. In alternativa, l'implementazione di u SO hè pussibule per via di a stallazione cù un schedariu di risposta automatica. Ma questu ùn serà micca discututu in l'articulu. Ancu se vi vede quì sottu chì aghjunghje sta funziunalità ùn hè micca difficiule.

  • cunfigurà i paràmetri OS (hostname, IP, etc.).

Cù questu approcciu, i stessi paràmetri sò realizati in sequenza in ogni servitore. L'efficienza di tali travagliu hè assai bassu.

L'essenza di l'automatizazione hè di eliminà a participazione umana da u prucessu di preparazione di u servitore. Quantu pussibule.

L'automatizazione riduce i tempi di inattività trà e operazioni è permette di furnisce più servitori simultaneamente. A probabilità di errori per causa di fatturi umani hè ancu assai ridutta.

Provisioning Bare-Metal, o preparazione automatica di i servitori da zero

Cumu sò i servitori cunfigurati automaticamente?

Analizemu tutte e tappe in detail.

Avete un servitore Linux chì utilizate cum'è un servitore d'installazione PXE. I servizii sò stallati è cunfigurati nantu à questu: DHCP, TFTP.

Allora, avviemu u servitore (chì deve esse cunfiguratu) via PXE. Ricurdemu cumu funziona:

  • U boot di a rete hè sceltu nantu à u servitore.
  • U servitore carica u PXE-ROM di a carta di rete è cuntattate u servitore di installazione via DHCP per ottene un indirizzu di rete.
  • U servitore di stallazione DHCP emette un indirizzu, è ancu istruzioni per più scaricamentu via PXE.
  • U servitore carica u bootloader di a rete da u servitore di installazione via PXE, a carica ulteriore si trova secondu u schedariu di cunfigurazione PXE.
  • U boot si basa nantu à i paràmetri ricevuti (kernel, initramfs, mount points, squashfs image, etc.).

Nota. L'articulu descrive u booting via PXE via u modu BIOS. Attualmente, i pruduttori implementanu attivamente UEFI bootmode. Per PXE, a diferenza serà in a cunfigurazione di u servitore DHCP è a presenza di un bootloader supplementu.

Fighjemu un esempiu di una cunfigurazione di u servitore PXE (menu pxelinux).

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 // меню по умолчанию
	MENU LABEL Linux Scripting Toolkits
	MENU default
	KERNEL menu.c32
	APPEND pxelinux.cfg/toolkit // переход на следующее меню

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

U kernel è l'initramfs in questa tappa sò una maghjina di Linux intermediata, cù l'aiutu di quale a preparazione principale è a cunfigurazione di u servitore si feranu.

Comu pudete vede, u bootloader passa parechji paràmetri à u kernel. Certi di sti paràmetri sò usati da u kernel stessu. È pudemu usà alcuni per i nostri scopi. Questu serà discututu più tardi, ma per avà pudete solu ricurdà chì tutti i paràmetri passati seranu dispunibili in l'imaghjina intermedia di Linux via /proc/cmdline.

Induve possu uttene, kernel è initramfs?
Comu basa, pudete sceglie qualsiasi distribuzione Linux. Ciò chì prestamu attenzione quandu sceglite:

  • l'imagine di boot deve esse universale (disponibilità di drivers, capacità di installà utilità supplementari);
  • Probabilmente, avete bisognu di persunalizà l'initramfs.

Cumu hè fattu questu in a nostra suluzione per X5? CentOS 7 hè statu sceltu cum'è a basa. Pruvemu u seguente truccu: preparanu a futura struttura di l'imaghjini, imballate in un archiviu è creanu un initramfs, in u quale ci sarà u nostru archiviu di u sistema di schedari. Quandu si carica l'imaghjini, l'archiviu serà allargatu in a partizione tmpfs creata. Questu modu averemu una maghjina di Linux in diretta minima, ma cumpleta, cù tutte l'utilità necessarie, custituita da solu dui schedari: vmkernel è 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

Allora avemu specificatu u kernel è initramfs chì deve esse carricatu. In u risultatu, in questa tappa, carghjendu l'imaghjini di linux intermediate via PXE, riceveremu a consola OS.

Grande, ma avà avemu bisognu di trasfiriri u cuntrollu à a nostra "automatizazione".

Pò esse fattu cusì.

Assumimu chì dopu a carica di l'imaghjina, pensamu di trasfiriri u cuntrollu à u script mount.sh.
Includemu l'script mount.sh in autorun. Per fà questu, avete bisognu di mudificà l'initramfs:

  • unpack initramfs (se usemu l'opzione initramfs sopra, questu ùn hè micca necessariu)
  • include u codice in l'iniziu chì analizà i paràmetri passati per /proc/cmdline è trasferisce u cuntrollu più;
  • pacchettu initramfs.

Nota. In u casu di u toolkit X5, u cuntrollu di carica hè trasferitu à u script /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Allora, l'imaghjina hè caricata, in quale u script mount.sh principia à l'autorun. In seguitu, u script mount.sh analizà i paràmetri passati (script_cmd=) durante l'esekzione è lancia u prugramma / script necessariu.

kit di strumenti per l'etichetta -vittura
kernel...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

kit di strumenti per l'etichetta -conchiglia
kernel...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Provisioning Bare-Metal, o preparazione automatica di i servitori da zero

Quì à a manca hè u menu PXE, à a diritta hè u schema di trasferimentu di cuntrollu.

Avemu capitu u trasferimentu di cuntrollu. Sicondu a scelta di u menù PXE, sia u script di cunfigurazione automatica sia a cunsola di debugging hè lanciata.

In u casu di cunfigurazione automatica, i repertorii necessarii sò muntati da u servitore di installazione, chì cuntenenu:

  • scripts;
  • mudelli BIOS / UEFI salvati per varii servitori;
  • firmware;
  • utilità di u servitore;
  • logs

In seguitu, u script mount.sh trasferisce u cuntrollu à u script master-install.sh da u cartulare di script.

L'arburu di script (l'ordine in quale sò lanciati) pare cusì cusì:

  • master-install
  • sharefunctions (funzioni cumuni)
  • info (output d'infurmazione)
  • mudelli (stabilisce i paràmetri di stallazione basatu annantu à u mudellu di u servitore)
  • prepare_utils (installazione di l'utilità necessaria)
  • fwupdate (aghjurnamentu di u firmware)
  • diag (diagnosi elementari)
  • biosconf (parametri BIOS/UEFI)
  • clockfix (fissà l'ora nantu à a scheda madre)
  • srmconf (configurazione di l'interfaccia remota)
  • raidconf (configurazione di volumi lògichi)

unu di:

  • preinstall (trasferendu u cuntrollu à l'installatore OS o ipervisore, cum'è ESXi)
  • merged-install (iniziu immediatu di unpacking l'imaghjini)

Avà sapemu:

  • quantu à boot un servitore via PXE;
  • cumu trasfiriri u cuntrollu à u vostru propiu script.


Cuntinuemu. I seguenti dumande sò diventati rilevanti:

  • Cumu identificà u servitore chì avemu preparatu?
  • Chì utilità è cumu cunfigurà u servitore?
  • Cumu uttene paràmetri per un servitore specificu?

Cumu identificà u servitore chì avemu preparatu?

Hè simplice - DMI:

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

Tuttu ciò chì avete bisognu hè quì: venditore, mudellu, numeru di serie. Se ùn site micca sicuru chì sta infurmazione hè presente in tutti i servitori, pudete identificà da u so indirizzu MAC. O in i dui modi à u stessu tempu, se i venditori di u servitore sò diffirenti è in certi mudelli ùn ci hè simplicemente micca infurmazione nantu à u numeru di serie.

Basatu nantu à l'infurmazioni ricevuti, i cartulare di a rete sò muntati da u servitore di installazione è tuttu ciò chì hè necessariu hè carricu (utilità, firmware, etc.).

Chì utilità è cumu cunfigurà u servitore?

Forniraghju utilità per Linux per certi fabricatori. Tutte e utilità sò dispunibili nantu à i siti web ufficiali di i venditori.

Provisioning Bare-Metal, o preparazione automatica di i servitori da zero

Cù u firmware, pensu chì tuttu hè chjaru. Di solitu venenu in forma di fugliali eseguibili imballati. U schedariu eseguibile cuntrolla u prucessu di l'aghjurnamentu di u firmware è riporta u codice di ritornu.

BIOS è IPMI sò generalmente cunfigurati per mezu di mudelli. Se necessariu, u mudellu pò esse editatu prima di scaricà.

L'utilità RAID da certi venditori ponu ancu esse cunfigurati cù un mudellu. Se questu ùn hè micca u casu, allora avete da scrive un script di cunfigurazione.

A prucedura per stallà RAID hè più spessu a siguenti:

  • Avemu dumandatu a cunfigurazione attuale.
  • Se ci sò digià array lògichi, li sguassemu.
  • Fighjemu quali dischi fisichi sò prisenti è quanti ci sò.
  • Crea un novu array logicu. Interrompemu u prucessu in casu d'errore.

Cumu uttene paràmetri per un servitore specificu?

Assumimu chì i paràmetri di tutti i servitori seranu guardati in u servitore di stallazione. In questu casu, per risponde à a nostra dumanda, prima deve esse decisu cumu trasfirì i paràmetri à u servitore di stallazione.

À u principiu, vi ponu arrivare cù i schedari testu. (In u futuru, pudete vulete usà un schedariu di testu cum'è un metudu di fallback per u trasferimentu di paràmetri).

Pudete "sparte" un schedariu di testu nantu à u servitore di stallazione. È aghjunghje a so muntagna à u script mount.sh.

I linii, per esempiu, pareranu cusì:

<numeru di serie> <hostname> <subnet>

Queste linee saranu trasferite à u schedariu da l'ingegnere da a so macchina di travagliu. È dopu, quandu si stallanu un servitore, i paràmetri per un servitore specificu seranu leghje da u schedariu.

Ma, à longu andà, hè megliu aduprà una basa di dati per almacenà paràmetri, stati è logs di installazioni di u servitore.

Di sicuru, una basa di dati solu ùn hè micca abbastanza, è avete bisognu di creà una parte di u cliente cù l'aiutu di quali paràmetri seranu trasferiti à a basa di dati. Questu hè più difficiuli di implementà paragunatu à un schedariu di testu, ma in fattu, tuttu ùn hè micca cusì difficiule cum'è pare. Hè abbastanza pussibile di scrive una versione minima di un cliente chì hà da trasfirià solu dati à a basa di dati sè stessu. È in u futuru serà pussibule di migliurà u prugramma di u cliente in modu liberu (rapporti, stampate etichette, invià notificazioni, etc. chì vene in mente).

Facendu una dumanda specifica à a basa di dati è specificendu u numeru di serie di u servitore, riceveremu i paràmetri necessarii per a cunfigurazione di u servitore.

In più, ùn avemu micca bisognu di vene cun serratura per accessu simultanea, cum'è u casu cù un schedariu di testu.

Pudemu scrive u logu di cunfigurazione à a basa di dati in tutte e tappe è cuntrullà u prucessu di stallazione attraversu avvenimenti è bandieri di e fasi di preparazione.

Avà sapemu cumu:

  • boot u servitore via PXE;
  • trasferimentu cuntrollu à u nostru script;
  • identificà u servitore chì deve esse preparatu da u so numeru di serie;
  • cunfigurà u servitore utilizendu l'utilità adattate;
  • trasferisce i paràmetri à a basa di dati di u servitore di installazione utilizendu a parte cliente.

Avemu scupertu cumu:

  • u servitore installatu riceve i paràmetri necessarii da a basa di dati;
  • tuttu u prugressu di preparazione hè arregistratu in a basa di dati (logs, avvenimenti, bandieri di scena).

Chì ci hè di i sfarenti tippi di software chì installate? Cumu installà un hypervisor, copià una VM è cunfigurà tuttu?

In u casu di implementà una maghjina di sistema di fugliale (linux) à u hardware, tuttu hè abbastanza simplice:

  • Dopu avè stallatu tutti i cumpunenti di u servitore, implementemu l'imaghjini.
  • Installa u bootloader grub.
  • Chroot è cunfigurà tuttu ciò chì hè necessariu.

Cumu trasfiriri u cuntrollu à l'installatore OS (usendu ESXi cum'è un esempiu).

  • Organizemu u trasferimentu di cuntrollu da u nostru script à l'installatore di l'ipervisore utilizendu u schedariu di risposta automatica (kickstart):
  • Sguassemu i partizioni attuali nantu à u discu.
  • Crea una partizione cù una dimensione di 500 MB.
  • Avemu marcatu cum'è bootable.
  • Format à FAT32.
  • Copiemu i schedarii di installazione ESXi à a radica.
  • Installazione di syslinux.
  • Copia syslinux.cfg in /syslinux/

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

  • Copia mboot.c32 à /syslinux.
  • Boot.cfg deve avè kernelopt=ks=ftp:// /ks_esxi.cfg
  • Reboot u servitore.

Dopu à u reboot di u servitore, l'installatore ESXi scaricarà da u discu duru di u servitore. Tutti i schedarii di l'installazione necessarii seranu caricati in memoria è poi l'installazione ESXi principia, secondu u schedariu di risposta automatica specificatu.

Eccu uni pochi di linii da u schedariu d'autore risposta 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

In questu stadiu, l'ipervisore hè stallatu è cunfiguratu, è e macchine virtuali sò copiati.

Cumu cunfigurà e macchine virtuali avà?

Avemu ingannatu un pocu: durante a stallazione avemu stabilitu u paràmetru guestinfo.esxihost.id = "$SYSSN" in u schedariu VM1.vmx è hà indicatu u numeru di serie di u servitore fisicu in questu.

Avà, dopu avè principiatu, a macchina virtuale (cù u pacchettu vmware-tools installatu) pò accede à stu paràmetru:

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

Questu hè, a VM hà da pudè identificà sè stessu (cunnosce u numeru di serie di l'ospite fisicu), fà una dumanda à a basa di dati di u servitore d'installazione è riceve i paràmetri chì deve esse cunfigurati. Questu hè tuttu compilatu in un script, chì deve esse lanciatu automaticamente quandu guestos vm principia (ma una volta: RunOnce).

Avà sapemu cumu:

  • boot u servitore via PXE;
  • trasferimentu cuntrollu à u nostru script;
  • identificà u servitore chì deve esse preparatu da u so numeru di serie;
  • cunfigurà u servitore utilizendu l'utilità adattate;
  • trasferimentu paràmetri à a basa di dati di u servitore di stallazione utilizendu a parte di u cliente;
  • cunfigurà varii tipi di software, cumprese l'implementazione di l'ipervisore esxi è a cunfigurazione di e macchine virtuali (tutte automaticamente).

Avemu scupertu cumu:

  • u servitore installatu riceve i paràmetri necessarii da a basa di dati;
  • tuttu u prugressu di preparazione hè arregistratu in a basa di dati (logs, avvenimenti, bandieri di scena).


ligna di fondu:

Credu chì l'unicità di sta suluzione si trova in a so flessibilità, simplicità, capacità è versatilità.

Per piacè scrive in i cumenti ciò chì pensate.

Source: www.habr.com

Add a comment