Aprovisionament Bare-Metal de bricolatge o preparació automàtica de servidors des de zero

Hola, em dic Denis i una de les meves àrees d'activitat és el desenvolupament de solucions d'infraestructura a X5. Avui m'agradaria compartir amb vosaltres com podeu implementar un sistema automàtic de preparació de servidors basat en eines disponibles públicament. Al meu entendre, aquesta és una solució interessant, senzilla i flexible.

Aprovisionament Bare-Metal de bricolatge o preparació automàtica de servidors des de zero

Per preparació ens referim a: convertir un nou servidor de la caixa en un servidor totalment configurat amb SO. Linux o amb l'hipervisor ESXi (el desplegament de servidors Windows no es parla en aquest article).

Termes:

  • servidors: servidors que cal configurar.
  • El servidor d'instal·lació és el servidor principal que proporciona tot el procés de preparació a la xarxa.

Per què és necessària l'automatització?

Diguem que hi ha una tasca: preparar massivament servidors des de zero, al màxim: 30 al dia. S'hi poden instal·lar servidors de diferents fabricants i models, diferents sistemes operatius i poden tenir o no un hipervisor.

Quines operacions s'inclouen en el procés de configuració (sense automatització):

  • connectar un teclat, ratolí, monitor al servidor;
  • configurar BIOS, RAID, IPMI;
  • actualitzar el firmware dels components;
  • desplegar una imatge del sistema de fitxers (o instal·lar un hipervisor i copiar màquines virtuals);

Nota. Alternativament, el desplegament del sistema operatiu és possible mitjançant la instal·lació amb un fitxer de resposta automàtica. Però això no es parlarà a l'article. Tot i que veureu a continuació que afegir aquesta funcionalitat no és difícil.

  • configurar els paràmetres del sistema operatiu (nom d'amfitrió, IP, etc.).

Amb aquest enfocament, els mateixos paràmetres es realitzen seqüencialment a cada servidor. L'eficiència d'aquest treball és molt baixa.

L'essència de l'automatització és eliminar la participació humana del procés de preparació del servidor. Tant com sigui possible.

L'automatització redueix el temps d'inactivitat entre operacions i fa possible subministrar diversos servidors simultàniament. També es redueix molt la probabilitat d'errors deguts a factors humans.

Aprovisionament Bare-Metal de bricolatge o preparació automàtica de servidors des de zero

Com es configuren els servidors automàticament?

Analitzem totes les etapes en detall.

Teniu un servidor Linux que feu servir com a servidor d'instal·lació PXE. S'hi instal·len i es configuren serveis: DHCP, TFTP.

Per tant, arrenquem el servidor (que s'ha de configurar) mitjançant PXE. Recordem com funciona:

  • L'arrencada de xarxa està seleccionada al servidor.
  • El servidor carrega el PXE-ROM de la targeta de xarxa i contacta amb el servidor d'instal·lació mitjançant DHCP per obtenir una adreça de xarxa.
  • El servidor d'instal·lació DHCP emet una adreça, així com instruccions per a una baixada posterior mitjançant PXE.
  • El servidor carrega el carregador d'arrencada de xarxa des del servidor d'instal·lació mitjançant PXE, la càrrega addicional es produeix segons el fitxer de configuració PXE.
  • L'arrencada es produeix en funció dels paràmetres rebuts (nucli, initramfs, punts de muntatge, imatge squashfs, etc.).

Nota. L'article descriu l'arrencada mitjançant PXE mitjançant el mode BIOS. Actualment, els fabricants estan implementant activament el mode d'arrencada UEFI. Per a PXE, la diferència estarà en la configuració del servidor DHCP i la presència d'un carregador d'arrencada addicional.

Vegem un exemple de configuració de servidor PXE (menú pxelinux).

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

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

El nucli i initramfs en aquesta etapa són una imatge de Linux intermèdia, amb l'ajuda de la qual es durà a terme la preparació i configuració principal del servidor.

Com podeu veure, el carregador d'arrencada passa molts paràmetres al nucli. Alguns d'aquests paràmetres són utilitzats pel propi nucli. I podem utilitzar-ne alguns per als nostres propis propòsits. Això es comentarà més endavant, però de moment només podeu recordar que tots els paràmetres passats estaran disponibles a la imatge intermèdia de Linux mitjançant /proc/cmdline.

On puc aconseguir-los, el nucli i els initramfs?
Com a base, podeu triar qualsevol distribució de Linux. En què prestem atenció a l'hora de triar:

  • la imatge d'arrencada ha de ser universal (disponibilitat de controladors, possibilitat d'instal·lar utilitats addicionals);
  • Molt probablement, haureu de personalitzar els initramfs.

Com es fa això a la nostra solució per a X5? Com a base es va triar CentOS 7. Provem el següent truc: preparar la futura estructura d'imatge, empaquetar-la en un arxiu i crear un initramfs, dins del qual hi haurà el nostre arxiu del sistema de fitxers. En carregar la imatge, l'arxiu s'ampliarà a la partició tmpfs creada. D'aquesta manera obtindrem una imatge de Linux en directe mínima, però completa, amb totes les utilitats necessàries, que consta només de dos fitxers: vmkernel i 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

Així que hem especificat el nucli i initramfs que s'han de carregar. Com a resultat, en aquesta fase, en carregar la imatge de Linux intermèdia mitjançant PXE, rebrem la consola del sistema operatiu.

Genial, però ara hem de transferir el control a la nostra "automatització".

Es pot fer així.

Suposem que després de carregar la imatge volem transferir el control a l'script mount.sh.
Incloem l'script mount.sh a l'execució automàtica. Per fer-ho haureu de modificar l'initramfs:

  • descomprimir initramfs (si utilitzem l'opció initramfs anterior, això no és necessari)
  • incloure codi a l'inici que analitzarà els paràmetres passats a través de /proc/cmdline i transferirà més el control;
  • paquet initramfs.

Nota. En el cas del conjunt d'eines X5, el control de càrrega es transfereix a l'script /opt/x5/toolkit/bin/hook.sh с помощью override.conf в getty tty1 (ExecStart=…)

Per tant, es carrega la imatge, en la qual l'script mount.sh comença a l'execució automàtica. A continuació, l'script mount.sh analitza els paràmetres passats (script_cmd=) durant l'execució i llança el programa/script necessari.

conjunt d'eines d'etiquetes-cotxe
nucli...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=master-install.sh

conjunt d'eines d'etiquetes-petxina
nucli...
append...nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash

Aprovisionament Bare-Metal de bricolatge o preparació automàtica de servidors des de zero

Aquí a l'esquerra hi ha el menú PXE, a la dreta el diagrama de transferència de control.

Hem descobert la transferència de control. Depenent de l'elecció del menú PXE, s'inicia l'script de configuració automàtica o la consola de depuració.

En el cas de la configuració automàtica, des del servidor d'instal·lació es munten els directoris necessaris, que contenen:

  • guions;
  • plantilles de BIOS/UEFI desades per a diversos servidors;
  • firmware;
  • utilitats del servidor;
  • registres

A continuació, l'script mount.sh transfereix el control a l'script master-install.sh des del directori de l'script.

L'arbre de seqüències de comandaments (l'ordre en què s'inicien) té un aspecte semblant a això:

  • instal·lació mestra
  • sharefunctions (funcions compartides)
  • informació (sortida d'informació)
  • models (configuració dels paràmetres d'instal·lació en funció del model de servidor)
  • prepare_utils (instal·lació de les utilitats necessàries)
  • fwupdate (actualització del firmware)
  • diag (diagnòstic elemental)
  • biosconf (configuració BIOS/UEFI)
  • clockfix (configuració de l'hora a la placa base)
  • srmconf (configuració de la interfície remota)
  • raidconf (configuració de volums lògics)

un de:

  • preinstal·lació (transferint el control al sistema operatiu o a l'instal·lador de l'hipervisor, com ara ESXi)
  • merged-install (inici immediat de desempaquetar la imatge)

Ara ho sabem:

  • com arrencar un servidor mitjançant PXE;
  • com transferir el control al vostre propi script.


Continuem. Les preguntes següents van ser rellevants:

  • Com identificar el servidor que estem preparant?
  • Quines utilitats i com configurar el servidor?
  • Com obtenir la configuració d'un servidor específic?

Com identificar el servidor que estem preparant?

És senzill - DMI:

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

Tot el que necessiteu és aquí: proveïdor, model, número de sèrie. Si no esteu segur que aquesta informació estigui present a tots els servidors, podeu identificar-los per la seva adreça MAC. O de les dues maneres al mateix temps, si els proveïdors de servidors són diferents i en alguns models simplement no hi ha informació sobre el número de sèrie.

A partir de la informació rebuda, des del servidor d'instal·lació es munten carpetes de xarxa i es carrega tot el necessari (utilitats, firmware, etc.).

Quines utilitats i com configurar el servidor?

Proporcionaré utilitats per a Linux per a alguns fabricants. Totes les utilitats estan disponibles als llocs web oficials dels venedors.

Aprovisionament Bare-Metal de bricolatge o preparació automàtica de servidors des de zero

Amb el firmware, crec que tot està clar. Normalment es presenten en forma de fitxers executables empaquetats. El fitxer executable controla el procés d'actualització del microprogramari i informa del codi de retorn.

La BIOS i l'IPMI solen configurar-se mitjançant plantilles. Si cal, la plantilla es pot editar abans de descarregar-la.

Les utilitats RAID d'alguns venedors també es poden configurar mitjançant una plantilla. Si aquest no és el cas, haureu d'escriure un script de configuració.

El procediment per configurar el RAID és més sovint el següent:

  • Demanem la configuració actual.
  • Si ja hi ha matrius lògiques, les esborrarem.
  • Vegem quins discs físics hi ha i quants n'hi ha.
  • Creeu una matriu lògica nova. Interrompem el procés en cas d'error.

Com obtenir la configuració d'un servidor específic?

Suposem que la configuració de tots els servidors s'emmagatzemarà al servidor d'instal·lació. En aquest cas, per respondre a la nostra pregunta, primer hem de decidir com transferir la configuració al servidor d'instal·lació.

Al principi, us podeu sortir amb fitxers de text. (En el futur, és possible que vulgueu utilitzar un fitxer de text com a mètode alternatiu per transferir la configuració.)

Podeu "compartir" un fitxer de text al servidor d'instal·lació. I afegiu el seu muntatge a l'script mount.sh.

Les línies, per exemple, seran així:

<número de sèrie> <nom d'amfitrió> <subxarxa>

Aquestes línies seran traslladades a l'arxiu per l'enginyer des de la seva màquina de treball. I després, quan es configura un servidor, els paràmetres d'un servidor específic es llegiran del fitxer.

Però, a llarg termini, és millor utilitzar una base de dades per emmagatzemar paràmetres, estats i registres de les instal·lacions del servidor.

Per descomptat, no n'hi ha prou amb una base de dades, i haureu de crear una part del client amb l'ajuda de la qual es transferirà la configuració a la base de dades. Això és més difícil d'implementar en comparació amb un fitxer de text, però de fet, tot no és tan difícil com sembla. És molt possible escriure una versió mínima d'un client que simplement transferirà dades a la base de dades. I en el futur es podrà millorar el programa client en modalitat lliure (informes, impressió d'etiquetes, enviament de notificacions, etc. que se us acudeixi).

Fent una sol·licitud específica a la base de dades i especificant el número de sèrie del servidor, rebrem els paràmetres necessaris per a la configuració del servidor.

A més, no haurem de crear bloquejos per a l'accés simultani, com és el cas d'un fitxer de text.

Podem escriure el registre de configuració a la base de dades en totes les etapes i controlar el procés d'instal·lació mitjançant esdeveniments i banderes de les etapes de preparació.

Ara ja sabem com:

  • arrencar el servidor mitjançant PXE;
  • transferir el control al nostre script;
  • identificar el servidor que cal preparar pel seu número de sèrie;
  • configurar el servidor mitjançant les utilitats adequades;
  • transfereix la configuració a la base de dades del servidor d'instal·lació mitjançant la part client.

Hem descobert com:

  • el servidor instal·lat rep la configuració necessària de la base de dades;
  • tot el progrés de la preparació es registra a la base de dades (registres, esdeveniments, banderes d'etapa).

Què passa amb els diferents tipus de programari que instal·leu? Com instal·lar un hipervisor, copiar una màquina virtual i configurar-ho tot?

En el cas de desplegar una imatge del sistema de fitxers (linux) al maquinari, tot és bastant senzill:

  • Després de configurar tots els components del servidor, despleguem la imatge.
  • Instal·leu el carregador d'arrencada grub.
  • Fem el chroot i configurem tot el que calgui.

Com transferir el control a l'instal·lador del sistema operatiu (utilitzant ESXi com a exemple).

  • Organitzem la transferència de control del nostre script a l'instal·lador de l'hipervisor mitjançant el fitxer de resposta automàtica (kickstart):
  • Suprimim les particions actuals del disc.
  • Creeu una partició amb una mida de 500 MB.
  • El marquem com a arrencable.
  • Format a FAT32.
  • Copiem els fitxers d'instal·lació d'ESXi a l'arrel.
  • Instal·lant syslinux.
  • Copieu syslinux.cfg a /syslinux/

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

  • Copieu mboot.c32 a /syslinux.
  • Boot.cfg hauria de tenir kernelopt=ks=ftp:// /ks_esxi.cfg
  • Reiniciem el servidor.

Després de reiniciar el servidor, l'instal·lador ESXi es baixarà del disc dur del servidor. Tots els fitxers d'instal·lació necessaris es carregaran a la memòria i després començarà la instal·lació d'ESXi, segons el fitxer de resposta automàtica especificat.

Aquí hi ha algunes línies del fitxer de resposta automàtica 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

En aquesta etapa, s'instal·la i configura l'hipervisor i es copien les màquines virtuals.

Com configurar les màquines virtuals ara?

Hem enganyat una mica: durant la instal·lació hem establert el paràmetre guestinfo.esxihost.id = "$SYSSN" al fitxer VM1.vmx i hem indicat el número de sèrie del servidor físic que hi ha.

Ara, després d'iniciar, la màquina virtual (amb el paquet vmware-tools instal·lat) pot accedir a aquest paràmetre:

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

És a dir, la VM podrà identificar-se (coneix el número de sèrie de l'amfitrió físic), fer una sol·licitud a la base de dades del servidor d'instal·lació i rebre els paràmetres que cal configurar. Tot això es compila en un script, que s'hauria de llançar automàticament quan s'iniciï guestos vm (però una vegada: RunOnce).

Ara ja sabem com:

  • arrencar el servidor mitjançant PXE;
  • transferir el control al nostre script;
  • identificar el servidor que cal preparar pel seu número de sèrie;
  • configurar el servidor mitjançant les utilitats adequades;
  • transferir la configuració a la base de dades del servidor d'instal·lació mitjançant la part client;
  • configurar diversos tipus de programari, inclòs el desplegament de l'hipervisor esxi i la configuració de màquines virtuals (tot de manera automàtica).

Hem descobert com:

  • el servidor instal·lat rep la configuració necessària de la base de dades;
  • tot el progrés de la preparació es registra a la base de dades (registres, esdeveniments, banderes d'etapa).


El resultat final:

Crec que la singularitat d'aquesta solució rau en la seva flexibilitat, senzillesa, capacitats i versatilitat.

Escriu als comentaris què et sembla.

Font: www.habr.com

Afegeix comentari