自己进行裸机配置或从头开始自动服务器准备

嗨,我是Denis,我的活动领域之一是在X5中开发基础结构解决方案。今天,我想与您分享如何部署基于公开可用工具的自动化服务器准备系统。我认为这是一个有趣,简单且灵活的解决方案。



准备的意思是:从新服务器中直接制造一台具有OS的完全配置的服务器 Linux或ESXi虚拟机管理程序(本文不讨论Windows Server Cast)。

条款

  • 服务器-需要配置的服务器。
  • 安装服务器-通过网络提供整个准备过程的主服务器。

为什么需要自动化?


假设有一个问题:从头开始大规模准备服务器-每天30个。不同制造商和型号的服务器,可以安装不同的操作系统,可能存在或可能不存在管理程序。

设置过程包括哪些操作(无自动化):

  • 将键盘,鼠标,显示器连接到服务器;
  • 配置BIOS,RAID,IPMI;
  • 升级组件固件;
  • 部署文件系统映像(或安装管理程序并复制虚拟机);

注意。或者,可以通过安装自动应答文件来部署操作系统。但这将不在本文中讨论。尽管您会在下面看到添加此功能很容易。

  • 配置操作系统参数(主机名,IP等)。

使用这种方法,可以在每个服务器上顺序执行相同的设置。这种工作的效率很低。

自动化的本质是在准备服务器的过程中避免人工参与。越多越好。

由于自动化,减少了操作之间的停机时间,并且可以同时准备多台服务器。由于人为因素而导致错误的可能性也大大降低了。



如何自动配置服务器?


我们将详细分析所有步骤。

您有一个用作PXE安装服务器的linux服务器。服务已在其上安装和配置:DHCP,TFTP。

因此,我们通过PXE加载服务器(需要配置)。回想一下它是如何工作的:

  • 选择通过网络引导的服务器。
  • 服务器将加载网卡的PXE-ROM,并通过DHCP与安装服务器联系以获得网络地址。
  • 安装服务器的DHCP提供地址,以及通过PXE进一步下载的说明。
  • 服务器通过PXE从安装服务器下载网络引导程序,进一步下载根据PXE配置文件进行。
  • 根据接收到的参数(内核,initramfs,安装点,squashfs映像等)执行下载。

注意。本文介绍了通过BIOS模式启动PXE。当前,制造商正在积极引入UEFI引导模式。对于PXE,区别在于DHCP服务器的配置和附加引导加载程序的存在。

考虑一个PXE服务器配置示例(pxelinux菜单)。

文件pxelinux.cfg /默认值:

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

文件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=”…”

此阶段的内核和initramfs是中间的linux映像,借助该映像,服务器的基本准备工作和配置将完成。

如您所见,引导程序将许多参数传递给内核。其中一些参数由内核本身使用。我们可以将一些用于我们自己的目的。稍后将对此进行描述,但是现在您仅可以记住,通过/ proc / cmdline在中间的Linux映像中可以使用所有传递的参数。

内核和initramfs从哪里获得?
作为基础,您可以选择任何Linux发行版。选择时我们要注意的是:

  • 引导映像必须是通用的(可用驱动程序,能够安装其他实用程序);
  • 最有可能需要定制initramfs。

在我们针对X5的解决方案中,这是如何完成的?我们选择CentOS 7作为基础,让我们做以下技巧:准备将来的映像结构,将其打包到归档文件中并创建initramfs,在其中将成为我们的文件系统归档文件。加载映像时,归档文件将部署到创建的tmpfs部分。因此,我们获得了一个最小的,功能齐全的实时Linux映像,其中包含所有必需的实用程序,该实用程序仅包含两个文件: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

因此,我们指定了应该加载的内核和initramfs。结果,在此阶段,通过PXE下载中间linux映像,我们得到了OS控制台。

很好,但是现在我们需要将控制权转移到我们的“自动化”上。

可以这样做。

假设在加载映像之后,我们计划将控制权转移到mount.sh脚本。
我们在自动运行中包含mount.sh脚本。为此,您需要修改initramfs:

  • 解压缩initramfs(如果我们使用上述版本的initramfs,则不需要这样做)
  • 在启动代码中包含将分析通过/ proc / cmdline传递的参数并进一步传输控制的代码;
  • 打包initramfs。

注意。对于X5工具包,引导控制已转移到脚本中,/opt/x5/toolkit/bin/hook.sh override.conf getty tty1 (ExecStart=…)

因此,将加载映像,其中mount.sh脚本将在启动时启动。接下来,在分析过程中,mount.sh脚本分析传递的参数(script_cmd =)并启动必要的程序/脚本。

标签工具包- 自动
内核...
附加... nfs_toolkit_script =脚本/ mount.sh script_cmd = master-install.sh

标签工具包- 外壳
内核...
append ... nfs_toolkit_script =脚本/ mount.sh script_cmd = / bin / bash



左侧是PXE菜单,右边是控制权转移方案。

随着控制权的转移,我们得以解决。根据PXE菜单的选择,将启动自动调整脚本或调试控制台。

在自动配置的情况下,将安装来自安装服务器的必要目录,其中包含:

  • 剧本;
  • 保存各种服务器的BIOS / UEFI模板;
  • 固件;
  • 服务器实用程序;
  • 日志。

接下来,mount.sh脚本将控制权从脚本目录转移到master-install.sh脚本。

脚本树(启动顺序)如下所示:

  • 主安装
  • 共享功能(通用功能)
  • 信息(信息输出)
  • 型号(根据服务器型号设置安装参数)
  • prepare_utils(安装必要的实用程序)
  • fwupdate(固件更新)
  • 诊断(基本诊断)
  • biosconf(BIOS / UEFI设置)
  • Clockfix(在主板上设置时间)
  • srmconf(配置远程接口)
  • raidconf(配置逻辑卷)

之一:

  • 预安装(将控制权转移到操作系统或管理程序的安装程序,例如ESXi)
  • 合并安装(直接开始解压缩映像)

现在我们知道:

  • 如何通过PXE引导服务器;
  • 如何将控制权转移到您自己的脚本。

让我们继续。以下问题已变得相关:

  • 如何识别我们正在准备的服务器?
  • 哪些实用程序以及如何配置服务器?
  • 如何获取特定服务器的设置?

如何识别我们正在准备的服务器?


很简单-DMI:

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

它具有您需要的一切:供应商,型号,序列号。如果不确定此信息是否出现在所有服务器中,则可以通过MAC地址识别它们。或者,如果服务器供应商不同,并且在某些型号上同时使用两种方式,则序列号信息根本不可用。

根据收到的信息,将安装来自安装服务器的网络文件夹,并加载所有必需的文件(实用程序,固件等)。

哪些实用程序以及如何配置服务器?


我将为一些制造商提供Linux实用程序。所有实用程序都可以在供应商的官方网站上找到。



有了固件,我认为一切都很清楚。它们通常以打包的可执行文件形式出现。可执行文件控制固件更新过程并报告返回码。

BIOS和IPMI通常是通过模板配置的。如有必要,可以在加载之前编辑模板。

一些供应商的RAID实用程序也可以根据模板进行配置。如果不是这种情况,则必须编写配置脚本。

配置RAID的过程通常如下:

  • 我们请求当前配置。
  • 如果已经存在逻辑数组,则将其删除。
  • 我们查看存在哪些物理磁盘,以及其中有多少物理磁盘。
  • 创建一个新的逻辑数组。如果发生错误,我们将中断该过程。

如何获取特定服务器的设置?


假设所有服务器设置都存储在安装服务器上。在这种情况下,为了回答我们的问题,您首先需要确定:如何将设置转移到安装服务器。

首先,很可能要处理文本文件。(将来,您可以使用文本文件作为传输设置的备份方式)。

您可以在安装服务器上“共享”文本文件。并将其添加到mount.sh脚本中。

例如,这些行将如下所示:

<序列号> <主机名> <子网>

这些行将由工程师从其工作计算机转移到文件中。然后,在设置服务器时,将从文件中读取特定服务器的参数。

但是,将来最好使用数据库来存储设置,状态和服务器安装日志。

当然,一个数据库无法做到,您将需要创建一个客户端部件,借助该客户端部件,设置将被传输到数据库中。这比文本文件更难实现,但实际上并不像听起来那样难。客户端的最低版本可以将数据简单地传输到数据库,这对于编写自己的版本是相当可行的。将来,也有可能以自由模式(报告,打印标签,发送通知等)进行改进,以备不时之需。

向数据库发出特定请求并指示服务器的序列号后,我们获得了配置服务器所需的参数。

另外,我们不需要发明用于同步访问的锁,就像文本文件一样。

我们可以在数据库的所有阶段写入配置日志,并通过准备阶段的事件和标志来控制安装过程。

现在我们知道了:

  • 通过PXE加载服务器;
  • 将控制权转移到我们的脚本;
  • 通过序列号识别要准备的服务器;
  • 使用适当的实用程序配置服务器;
  • 使用客户端将设置转移到安装服务器数据库。

了解如何:

  • 安装的服务器从数据库接收必要的设置;
  • 所有准备进度都记录在数据库中(日志,事件,阶段标志)。

如何安装不同类型的软件?如何安装虚拟机管理程序,复制VM并配置所有这些?


在将文件系统映像(linux)部署到硬件的情况下,一切都非常简单:

  • 设置所有服务器组件之后,部署映像。
  • 安装grub引导程序。
  • 我们制作chroot并配置所有必要的东西。

如何将控制权转移到OS安装程序(以ESXi为例)。

  • 我们使用自动响应文件(kickstart)来组织从脚本到虚拟机监控程序安装程序的控制转移:
  • 删除磁盘上的当前分区。
  • 创建一个500MB的分区。
  • 我们将其标记为启动。
  • 格式为FAT32。
  • 我们将ESXi安装文件复制到根目录。
  • 安装syslinux。
  • 将syslinux.cfg复制到/ syslinux /

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

  • 将mboot.c32复制到/ syslinux。
  • 在boot.cfg中应该有kernelopt = ks = ftp:// <安装服务器的IP> /ks_esxi.cfg
  • 重新启动服务器。

服务器重新引导后,ESXi安装程序将从其硬盘驱动器引导。根据指定的自动应答文件,所有必需的安装程序文件将被加载到内存中,并且ESXi的安装将开始。

以下是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

在此阶段,将安装和配置虚拟机监控程序,并复制虚拟机。

现在如何配置虚拟机?

我们作弊:在安装过程中,我们在VM1.vmx文件中设置guestinfo.esxihost.id =“ $ SYSSN”参数,指示其中的物理服务器的序列号。

现在,启动后,虚拟机(安装了vmware-tools软件包)可以访问此参数:

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

也就是说,VM将能够标识自己(知道物理主机的序列号),向安装服务器数据库发出请求并获取需要配置的参数。这全部在脚本中执行,该脚本应在guestos vm启动时自动启动(但一次:RunOnce)。

现在我们知道了:

  • 通过PXE加载服务器;
  • 将控制权转移到我们的脚本;
  • 通过序列号识别要准备的服务器;
  • 使用适当的实用程序配置服务器;
  • 使用客户端将设置转移到安装服务器数据库;
  • 配置各种类型的PO,包括部署esxi管理程序和配置虚拟机(以及全部自动)。

了解如何:

  • 安装的服务器从数据库接收必要的设置;
  • 所有准备进度都记录在数据库中(日志,事件,阶段标志)。

底线:

我认为该解决方案的独特之处在于其灵活性,简单性,功能和多功能性。

请在评论中写下您的想法。

All Articles