嗨,我是Denis,我的活动领域之一是在X5中开发基础结构解决方案。今天,我想与您分享如何部署基于公开可用工具的自动化服务器准备系统。我认为这是一个有趣,简单且灵活的解决方案。
准备的意思是:从新服务器中直接制造一台具有OS的完全配置的服务器 Linux或ESXi虚拟机管理程序(本文不讨论Windows Server Cast)。条款:- 服务器-需要配置的服务器。
- 安装服务器-通过网络提供整个准备过程的主服务器。
为什么需要自动化?
假设有一个问题:从头开始大规模准备服务器-每天30个。不同制造商和型号的服务器,可以安装不同的操作系统,可能存在或可能不存在管理程序。设置过程包括哪些操作(无自动化):- 将键盘,鼠标,显示器连接到服务器;
- 配置BIOS,RAID,IPMI;
- 升级组件固件;
- 部署文件系统映像(或安装管理程序并复制虚拟机);
注意。或者,可以通过安装自动应答文件来部署操作系统。但这将不在本文中讨论。尽管您会在下面看到添加此功能很容易。使用这种方法,可以在每个服务器上顺序执行相同的设置。这种工作的效率很低。自动化的本质是在准备服务器的过程中避免人工参与。越多越好。由于自动化,减少了操作之间的停机时间,并且可以同时准备多台服务器。由于人为因素而导致错误的可能性也大大降低了。
如何自动配置服务器?
我们将详细分析所有步骤。您有一个用作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管理程序和配置虚拟机(以及全部自动)。
了解如何:
- 安装的服务器从数据库接收必要的设置;
- 所有准备进度都记录在数据库中(日志,事件,阶段标志)。
底线:我认为该解决方案的独特之处在于其灵活性,简单性,功能和多功能性。请在评论中写下您的想法。