Aprovisionamiento de metal desnudo hágalo usted mismo o preparación automática del servidor desde cero

Hola, soy Denis y una de mis áreas de actividad es el desarrollo de soluciones de infraestructura en X5. Hoy me gustaría compartir con ustedes sobre cómo pueden implementar un sistema automatizado de preparación del servidor basado en herramientas disponibles públicamente. En mi opinión, esta es una solución interesante, simple y flexible.



Por preparación se entiende: hacer desde un nuevo servidor listo para usar, un servidor totalmente configurado con SO Linux o con el hipervisor ESXi (la conversión del servidor de Windows no se trata en este artículo).

Términos :

  • servidores: servidores que deben configurarse.
  • servidor de instalación: el servidor principal que proporciona todo el proceso de preparación a través de la red.

¿Por qué necesitas automatización?


Digamos que hay un problema: preparar en masa el servidor desde cero, en el pico: 30 por día. Servidores de diferentes fabricantes y modelos, se pueden instalar diferentes sistemas operativos en ellos, un hipervisor puede o no existir.

Qué operaciones se incluyen en el proceso de configuración (sin automatización):

  • conecte el teclado, el mouse, el monitor al servidor;
  • configurar BIOS, RAID, IPMI;
  • actualizar el firmware del componente;
  • implementar una imagen del sistema de archivos (o instalar un hipervisor y copiar máquinas virtuales);

Nota. Alternativamente, es posible implementar el sistema operativo a través de la instalación con un archivo de respuesta automática. Pero esto no se discutirá en el artículo. Aunque verá a continuación que agregar esta funcionalidad es fácil.

  • configurar los parámetros del sistema operativo (nombre de host, IP, etc.).

Con este enfoque, la misma configuración se realiza secuencialmente en cada servidor. La efectividad de tal trabajo es muy baja.

La esencia de la automatización es excluir la participación humana del proceso de preparación del servidor. Cuanto más se pueda.

Gracias a la automatización, el tiempo de inactividad entre operaciones se reduce y se hace posible preparar varios servidores al mismo tiempo. La probabilidad de errores debidos al factor humano también se reduce considerablemente.



¿Cómo se configuran los servidores automáticamente?


Analizaremos todos los pasos en detalle.

Tiene un servidor Linux que utiliza como servidor de instalación PXE. Los servicios están instalados y configurados en él: DHCP, TFTP.

Entonces, cargamos el servidor (que necesita ser configurado) por PXE. Recordemos cómo funciona:

  • El servidor seleccionado para arrancar a través de la red.
  • El servidor carga el PXE-ROM de la tarjeta de red y se pone en contacto con el servidor de instalación a través de DHCP para obtener la dirección de red.
  • El DHCP del servidor de instalación proporciona la dirección, así como las instrucciones para su posterior descarga a través de PXE.
  • El servidor descarga el gestor de arranque de red desde el servidor de instalación a través de PXE; la descarga adicional se realiza de acuerdo con el archivo de configuración de PXE.
  • La descarga se realiza en función de los parámetros recibidos (kernel, initramfs, puntos de montaje, imagen de squashfs, etc.).

Nota. Este artículo describe el arranque PXE a través del modo BIOS. Actualmente, los fabricantes están introduciendo activamente el modo de arranque UEFI. Para PXE, la diferencia estará en la configuración del servidor DHCP y la presencia de un gestor de arranque adicional.

Considere un ejemplo de configuración del servidor PXE (menú pxelinux).

Archivo 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 //    

Archivo 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 kernel y initramfs en esta etapa son una imagen de Linux intermedia, con la ayuda de la cual se llevará a cabo la preparación básica y la configuración del servidor.

Como puede ver, el gestor de arranque pasa muchos parámetros al núcleo. Algunos de estos parámetros son utilizados por el núcleo mismo. Y podemos usar algunos para nuestros propios fines. Esto se describirá más adelante, pero por ahora puede recordar que todos los parámetros pasados ​​estarán disponibles en la imagen de Linux intermedia a través de / proc / cmdline.

¿Dónde conseguirlos, el kernel y initramfs?
Como base, puede elegir cualquier distribución de Linux. A qué prestamos atención al elegir:

  • la imagen de arranque debe ser universal (controladores disponibles, la capacidad de instalar utilidades adicionales);
  • muy probablemente, initramfs necesitará ser personalizado.

¿Cómo se hace esto en nuestra solución para X5? Elegimos CentOS 7 como base. Hagamos el siguiente truco: preparar la estructura de la imagen futura, empaquetarla en el archivo y crear initramfs, dentro de la cual estará nuestro archivo del sistema de archivos. Al cargar la imagen, el archivo se desplegará en la sección tmpfs creada. Por lo tanto, obtenemos una imagen live-linux mínima pero completa con todas las utilidades necesarias, que consta de solo dos archivos: vmkernel e 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

Entonces, hemos especificado un kernel e initramfs que deben cargarse. Como resultado, en esta etapa, descargando la imagen intermedia de Linux a través de PXE, obtenemos la consola del sistema operativo.

Genial, pero ahora necesitamos transferir el control a nuestra "automatización".

Se puede hacer así.

Supongamos que, después de cargar la imagen, planeamos transferir el control al script mount.sh.
Incluimos el script mount.sh en ejecución automática. Para hacer esto, necesita modificar initramfs:

  • descomprimir initramfs (si usamos la versión anterior de initramfs, esto no es obligatorio)
  • incluir en el código de inicio que analizará los parámetros pasados ​​a través de / proc / cmdline y continuará transfiriendo el control;
  • paquete initramfs.

Nota. En el caso del kit de herramientas X5, el control de arranque se transfiere al script /opt/x5/toolkit/bin/hook.sh override.conf getty tty1 (ExecStart=…)

, por lo que se carga la imagen, en la que el script mount.sh comienza al inicio. A continuación, el script mount.sh en el proceso de análisis analiza los parámetros pasados ​​(script_cmd =) y lanza el programa / script necesario.

label toolkit- auto
kernel ...
append ... nfs_toolkit_script = scripts / mount.sh script_cmd = master-install.sh

label toolkit- shell
kernel ...
append ... nfs_toolkit_script = scripts / mount.sh script_cmd = / bin / bash



Aquí en el lado izquierdo está el menú PXE , a la derecha está el esquema de transferencia de control.

Con la transferencia de control, lo descubrimos. Dependiendo de la elección del menú PXE, se inicia el script de autoajuste o la consola de depuración.

En el caso de la configuración automática, se montan los directorios necesarios del servidor de instalación, en los que hay:

  • guiones;
  • plantillas BIOS / UEFI guardadas de varios servidores;
  • firmware;
  • utilidades para servidores;
  • troncos

A continuación, el script mount.sh transfiere el control al script master-install.sh desde el directorio de scripts.

El árbol de guiones (el orden de su lanzamiento) se ve más o menos así:

  • instalación maestra
  • funciones compartidas (funciones comunes)
  • info (salida de información)
  • modelos (configuración de parámetros de instalación basados ​​en el modelo del servidor)
  • prepare_utils (instalando las utilidades necesarias)
  • fwupdate (actualización de firmware)
  • diag (diagnóstico elemental)
  • biosconf (configuración BIOS / UEFI)
  • clockfix (establecer la hora en la placa base)
  • srmconf (configuración de la interfaz remota)
  • raidconf (configuración de volúmenes lógicos)

uno de:

  • preinstalación (transferencia de control al instalador del sistema operativo o hipervisor, por ejemplo ESXi)
  • instalación combinada (inicio directo de desempaquetar la imagen)

Ahora sabemos:

  • cómo arrancar el servidor a través de PXE;
  • cómo transferir el control a tu propio script.

Continuemos. Los siguientes problemas se han vuelto relevantes:

  • ¿Cómo identificar el servidor que estamos preparando?
  • ¿Qué utilidades y cómo configurar el servidor?
  • ¿Cómo obtener la configuración de un servidor específico?

¿Cómo identificar el servidor que estamos preparando?


Es simple - DMI:

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

Tiene todo lo que necesita: un proveedor, un modelo, un número de serie. Si no está seguro de que esta información se presente en todos los servidores, puede identificarlos por dirección MAC. O de ambas maneras al mismo tiempo si los proveedores de servidores son diferentes y en algunos modelos la información del número de serie simplemente no está disponible.

Según la información recibida, se montan las carpetas de red del servidor de instalación y se carga todo lo necesario (utilidades, firmware, etc.).

¿Qué utilidades y cómo configurar el servidor?


Daré utilidades para Linux para algunos fabricantes. Todas las utilidades están disponibles en los sitios web oficiales de los proveedores.



Con el firmware, creo que todo está claro. Por lo general, vienen en ejecutables empaquetados. El archivo ejecutable controla el proceso de actualización del firmware e informa un código de retorno.

El BIOS y el IPMI generalmente se configuran a través de plantillas. Si es necesario, la plantilla se puede editar antes de cargar.

Las utilidades RAID para algunos proveedores también pueden configurarse de acuerdo con la plantilla. Si este no es el caso, tendrá que escribir un script de configuración.

El procedimiento para configurar RAID suele ser el siguiente:

  • Solicitamos la configuración actual.
  • Si ya hay arreglos lógicos, lo borramos.
  • Observamos qué discos físicos están presentes y cuántos de ellos.
  • Crea una nueva matriz lógica. Interrumpimos el proceso en caso de error.

¿Cómo obtener la configuración de un servidor específico?


Supongamos que todas las configuraciones del servidor se almacenan en el servidor de instalación. En este caso, para responder a nuestra pregunta, primero debe decidir: cómo transferir la configuración al servidor de instalación.

Al principio, es bastante posible hacerlo con archivos de texto. (En el futuro, puede usar un archivo de texto como una forma de respaldo para transferir la configuración).

Puede "compartir" un archivo de texto en el servidor de instalación. Y agréguelo al script mount.sh.

Las líneas, por ejemplo, se verán así:

<número de serie> <nombre del host> <subred> El

ingeniero transferirá estas líneas al archivo desde su máquina de trabajo. Y luego, al configurar el servidor, los parámetros para un servidor específico se leerán del archivo.

Pero, en el futuro, es mejor usar la base de datos para almacenar la configuración, los estados y los registros de instalación del servidor.

Por supuesto, una base de datos no puede funcionar, y tendrá que crear una parte del cliente, con la ayuda de la cual se transferirá la configuración a la base de datos. Esto es más difícil de implementar que un archivo de texto, pero en realidad no es tan difícil como parece. La versión mínima del cliente, que simplemente transferirá datos a la base de datos, es bastante factible de escribir usted mismo. En el futuro, será posible mejorar el programa del cliente también en modo libre (informes, impresión de etiquetas, envío de notificaciones, etc., lo que se le ocurra).

Después de realizar una solicitud específica a la base de datos e indicar el número de serie del servidor, obtenemos los parámetros necesarios para configurar el servidor.

Además, no necesitamos inventar bloqueos para acceso simultáneo, como es el caso de un archivo de texto.

Podemos escribir el registro de configuración en todas las etapas de la base de datos y controlar el proceso de instalación a través de eventos y marcas de las etapas de preparación.

Ahora sabemos cómo:

  • cargar el servidor a través de PXE;
  • transferir el control a nuestro script;
  • identificar el servidor que se preparará por número de serie;
  • configurar el servidor con las utilidades apropiadas;
  • transferir configuraciones a la base de datos del servidor de instalación utilizando la parte del cliente.

Descubrí cómo:

  • el servidor instalado recibe la configuración necesaria de la base de datos;
  • todo el progreso de la preparación se registra en la base de datos (registros, eventos, indicadores de etapa).

¿Qué pasa con los diferentes tipos de software que se instalan? ¿Cómo instalar un hipervisor, copiar una VM y configurar todo esto?


En el caso de implementar una imagen del sistema de archivos (linux) en el hardware, todo es bastante simple:

  • Después de configurar todos los componentes del servidor, implemente la imagen.
  • Instale el gestor de arranque grub.
  • Hacemos chroot y configuramos todo lo necesario.

Cómo transferir el control al instalador del sistema operativo (usando ESXi como ejemplo).

  • Organizamos la transferencia de control de nuestro script al instalador del hipervisor utilizando el archivo de respuesta automática (kickstart):
  • Eliminar las particiones actuales en el disco.
  • Crea una partición de 500 MB.
  • Lo marcamos como arranque.
  • Formatear en FAT32.
  • Copiamos los archivos de instalación de ESXi a la raíz.
  • Instalar syslinux.
  • Copie syslinux.cfg a / syslinux /

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

  • Copie mboot.c32 a / syslinux.
  • En boot.cfg debe haber kernelopt = ks = ftp: // <IP del servidor de instalación> /ks_esxi.cfg
  • Reinicia el servidor.

Después de reiniciar el servidor, el instalador de ESXi se iniciará desde su disco duro. Todos los archivos de instalación necesarios se cargarán en la memoria y comenzará la instalación de ESXi, de acuerdo con el archivo de respuesta automática especificado.

Aquí hay algunas líneas del archivo de respuesta 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: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

#      

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 esta etapa, se instala y configura un hipervisor, se copian las máquinas virtuales.

¿Cómo configurar máquinas virtuales ahora?

Hicimos trampa un poco: durante la instalación configuramos el parámetro guestinfo.esxihost.id = "$ SYSSN" en el archivo VM1.vmx, indicando el número de serie del servidor físico en él.

Ahora, después de comenzar, la máquina virtual (con el paquete vmware-tools instalado) puede acceder a este parámetro:

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

Es decir, la VM podrá identificarse (conoce el número de serie del host físico), realizar una solicitud a la base de datos del servidor de instalación y obtener los parámetros que deben configurarse. Todo esto se ejecuta en un script que debe iniciarse automáticamente cuando se inicia guestos vm (pero una vez: RunOnce).

Ahora sabemos cómo:

  • cargar el servidor a través de PXE;
  • transferir el control a nuestro script;
  • identificar el servidor que se preparará por número de serie;
  • configurar el servidor con las utilidades apropiadas;
  • transferir configuraciones a la base de datos del servidor de instalación utilizando la parte del cliente;
  • Configure varios tipos de PO, incluida la implementación del hipervisor esxi y la configuración de máquinas virtuales (y todo de forma automática).

Descubrí cómo:

  • el servidor instalado recibe la configuración necesaria de la base de datos;
  • todo el progreso de la preparación se registra en la base de datos (registros, eventos, indicadores de etapa).

En pocas palabras:

creo que la singularidad de esta solución radica en su flexibilidad, simplicidad, sus capacidades y versatilidad.

Por favor escribe en los comentarios lo que piensas.

All Articles