如何在20分钟内批量部署20台 ESXi 服务器?
【作者】陈著峰,某银行主机管理员
近期新到20台华为RH2288V5服务器,需要部署ESXi,由于机器较多,于是考虑是否能用pxe实现批量部署,经过两天的摸索实践,最终也实现了上述目标,现记录一下过程。
先介绍一下背景。此次新到的RH2288V5,前面没有配硬盘,只在后面PCI卡位置配了一块M2的SSD。经过查看BIOS,机器配了两块RAID卡,一块用于管理前硬盘背板,另外一块用于管理PCI槽位的M2 SSD。服务器默认的RAID配置,没有划分VD,配的唯一一块SSD配为Unconfigure Good状态,且RAID控制器没有开启JBOD模式。
由于整机只配了一块SSD,RAID卡要么把这唯一的一块SSD划分一个RAID0的VD,要么开启RAID控制器的JBOD模式让这块SSD以直通模式被操作系统识别。那么问题来了,如何批量修改这一批机器的RAID呢?分别接显示器进BIOS一台台配RAID显然不是最好的办法,费时费力。需要说明的是,华为RH2288V5服务器默认是开启了UEFI引导的,基本上各大品牌现在新出的服务器,都是默认UEFI模式了。
经过一番搜寻,发现Broadcom提供了一个叫StorCLI的命令行工具,这个工具可以实现对RAID卡所有的配置,下载地址https://docs.broadcom.com/docs/MR_SAS_Unified_StorCLI_7.8-007.0813.0000.0000.zip。那是否能通过pxe引导一个live模式的linux,然后自动运行storecli把控制器JBOD模式启用起来呢?目标是在最短的时间内实现批量配置RAID,所以最好是拿一个开箱即用的linux,不能涉及到复杂的修改或定制linux启动介质等工作,最终经过一番测试后在clonezilla上实现了所需的功能。
clonezilla是一个基于debian/ubuntu修改的发行版,不带图形界面,其主要用途其实是备份/恢复系统,那为什么会选择用它呢?首先是这个发行版体积比较小,整个ISO只有不到300M;其次最重要的是它支持在grub的内核参数传入一些它自定义的参数,来实现很多额外的功能,其中最重要是有我们需要的直接运行命令的参数!
版本使用是用的 clonezilla-live-20180812-bionic-amd64.iso,它是基于ubuntu 18.04LTS修改而来。下载地址:https://sourceforge.net/projects/clonezilla/files/clonezilla_live_alternative/
让我们首先来详细分析如何使用pxe+clonezilla+storcli实现批量配置服务器RAID。
1、首先需要准备一台RHEL7的虚拟机(当然你要喜欢的话用物理机也行,网络能通就行),这台机用于提供dhcp+tftp+nfs服务,这些服务都需要先配置好,具体关于如何配置以及PXE引导更多的内容,可以参考我的上一篇文章。在这篇文章中,用于dhcpd分配IP的是虚拟机第二块网卡,地址配的是192.168.3.1,网段当然就是192.168.3.0了。
2、准备前期所需的脚本及storcli主程序。本文使用的NFS目录为/nfs/pxe,在这个目录里面,准备好3个文件,分别是jbod.sh,storcli64,ks_esxi.cfg。
jbod.sh用于clonezilla引导成功之后,通过该脚本来执行storcli配RAID,该文件内容如下:
echo "";
echo "**** Ready to run StorCli! ****";
echo "";
sleep 5;
sudo /opt/storcli64 /c1 set jbod=on;
sleep 5;
echo "";
sudo /opt/storcli64 show;
sleep 10;
echo "";
echo "**** Going to REBOOT NOW! ****";
echo "";
sleep 5;
sudo reboot;
这里需要解释两条命令。
storcli64 show
是查看当前系统的RAID卡基本信息,RH2288V5配的两个RAID卡会显示为第0块和第1块RAID控制器,M2 SSD所在的RAID卡为第1块。
storcli64 /c1 set jbod=on
是指将第1块RAID卡的jbod功能设为on,即打开接了M2 SSD的RAID卡的JBOD功能。
storcli64为主程序,这个文件需要从storcli的包解压出来,从压缩包里面的ubuntu或linux目录里面的deb/rpm包提取均可(可使用7zip来解压提取)。
3、准备使用PXE引导clonezilla。下载好clonezilla的ISO,将它解压到/var/lib/tftpboot/images/clonezilla目录,然后把RHEL7的grubx64.efi拷到上述目录并创建grub的配置文件grub.cfg。(至于为什么不直接使用clonezilla的ISO自带的grubx64.efi,是因为实测它自带的grubx64.efi无论如何都不认grub.cfg的配置文件,也可能是我放的路径不对吧)。
cp /boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/images/clonezilla
touch /var/lib/tftpboot/images/clonezilla/grub.cfg
4、配置PXE引导clonezilla。grub.cfg的完整内容如下:
set default=0
set timeout=3
menuentry "Clonezilla live (Default settings, VGA 1024x768)"{
linuxefi images/clonezilla/live/vmlinuz boot=live union=overlay username=user hostname=bionic config components noswap edd=on nomodeset locales= keyboard-layouts=NONE ocs_live_run="/opt/jbod.sh" ocs_live_batch="no" ip= net.ifnames=0 vmwgfx.enable_fbdev=1 fetch=tftp://192.168.3.1/images/clonezilla/live/filesystem.squashfs ocs_preload="mount -t nfs 192.168.3.1:/nfs/pxe /tmp/nfs" vga=791
initrdefi images/clonezilla/live/initrd.img}
上面这些参数其实是从clonezilla自带的grub.cfg修改而来的,需要解释的参数有如下几个(跟自带的grub.cfg一样的地方就不解释了):
ocs_live_run="/opt/jbod.sh"
这个是指clonezilla引导完成后直接自动执行/opt/jbod.sh,而不是自带的clonezilla备份恢复菜单。
fetch=tftp://192.168.3.1/images/clonezilla/live/filesystem.squashfs
这个是让clonezilla以tftp协议获取192.168.3.1/images/clonezilla/live/filesystem.squashfs文件,这个文件是上一步已经解压出来的,这个文件是用于提供liveOS的文件系统镜像(即普通linux的根目录下面的所有文件打的包)。
ocs_preload="mount -t nfs 192.168.3.1:/nfs/pxe /tmp/nfs"
这个是指clonezilla引导完成之前先挂载192.168.3.1:/nfs/pxe的NFS目录到/tmp/nfs,clonezilla会自动把ocs_preload后面跟的NFS目录内的所有文件都拷到/opt目录里面去,现在明白为什么jbod.sh脚本里面要用sudo /opt/storcli64 了吧?
5、上述工作都准备好之后,启动或重启RHEL7虚拟机的dhcpd/xinetd/nfs服务,然后把20台服务器都接上网线(建议先只接唯一的一条用于DHCP+PXE的网线,其它网线先不要接),注意一定要跟上面的RHEL7虚拟机的网络要通,要让这些服务器获取到RHEL7虚拟机DHCP分配出来的IP地址。
然后就可以把20台服务器都开机了,DHCP获取到地址之后会通过PXE使用tftp获取grubx64.efi引导文件和grub.cfg配置文件,然后引导grub,读取配置文件并按配好的内核参数引导clonezilla,自动挂载RHEL7虚拟机的/nfs/pxe目录并把该目录里的3个文件拷到/opt中,然后会执行/opt/jbod.sh脚本,即调用storcli64将SSD所在RAID卡JBOD功能打开,最后自动重启服务器(机器自动重启之后仍然会继续从PXE引导并再次执行jbod.sh,这个不会对RAID配置有什么影响)。
以下部分是RHEL7虚拟机上的/var/log/messages执行DHCP分配引导clonezilla的部分日志:
Mar 7 21:19:21 RHEL76 dhcpd: DHCPDISCOVER from 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:22 RHEL76 dhcpd: DHCPOFFER on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:24 RHEL76 dhcpd: DHCPREQUEST for 192.168.3.16 (192.168.3.1) from 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:24 RHEL76 dhcpd: DHCPACK on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:24 RHEL76 xinetd[7426]: START: tftp pid=8860 from=192.168.3.16
Mar 7 21:19:24 RHEL76 in.tftpd[8861]: Error code 8: User aborted the transfer
Mar 7 21:19:25 RHEL76 in.tftpd[8862]: Client 192.168.3.16 finished images/clonezilla/grubx64.efi
Mar 7 21:19:25 RHEL76 in.tftpd[8872]: Client 192.168.3.16 finished /images/clonezilla/grub.cfg
Mar 7 21:19:25 RHEL76 in.tftpd[8877]: Client 192.168.3.16 finished /images/clonezilla/grub.cfg
Mar 7 21:19:30 RHEL76 in.tftpd[8879]: Client 192.168.3.16 finished images/clonezilla/live/vmlinuz
Mar 7 21:19:39 RHEL76 in.tftpd[8880]: Client 192.168.3.16 finished images/clonezilla/live/initrd.img
Mar 7 21:19:45 RHEL76 dhcpd: DHCPDISCOVER from 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:45 RHEL76 dhcpd: DHCPOFFER on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:45 RHEL76 dhcpd: DHCPREQUEST for 192.168.3.16 (192.168.3.1) from 00:0c:29:4e:1a:31 via ens34
Mar 7 21:19:45 RHEL76 dhcpd: DHCPACK on 192.168.3.16 to 00:0c:29:4e:1a:31 via ens34Mar 7 21:19:50 RHEL76 in.tftpd[8882]: Client 192.168.3.16 finished /images/clonezilla/live/filesystem.squashfs
jbod.sh在clonezilla自动执行的结果大概如下图所示:
(截图为虚拟机内测试运行的结果,由于没有RAID卡所以会报not found,实际在服务器上跑的时候下面会输出JBOD enabled之类的日志)
关于clonezilla的PXE引导说明,以及clonezilla支持的内核参数说明,可以参考如下两个官方文档:
https://clonezilla.org/livepxe.php
https://clonezilla.org/fine-print-live-doc.php?path=clonezilla-live/doc/99_Misc/00_live-boot-parameters.doc
接下来就轮到使用PXE+Kickstart来批量自动部署ESXi了。
RAID配成JBOD之后,系统已经能认到SSD了,现在该批量部署ESXi了。
1、准备好esxi的ISO,把ISO里面的所有文件都拷到RHEL7虚拟机的 /var/lib/tftpboot/images/esx60u3 目录。然后把ISO自带的efi文件拷到当前目录。
cd /var/lib/tftpboot/images/esxi60u3
cp efi/boot/bootx64.efi .
2、编辑 /var/lib/tftpboot/images/esx60u3/boot.cfg,这个文件是esxi引导efi的配置文件。
主要需要修改2个地方,第一个是把kernel=和modules=后面跟的内容的/全部去掉,modules一行里面包含的/比较多,如果编辑用的是vim,可以用如下命令快速全部替换 :%s////g ,或者用如下命令 sed -i 's////g' /var/lib/tftpboot/images/esxi60u3/boot.cfg ;第二个是添加kickstart路径的参数,在 kernelopt=runweasel 后面加上 ks=nfs://192.168.3.1/nfs/pxe/ks_esxi.cfg ,即让安装程序从192.168.3.1的/nfs/pxe/ks_esxi.cfg获取kickstart自动安装配置文件。
修改完之后保存,文件内容大概类似如下这样:
bootstate=0
title=Loading ESXi installer
timeout=2
kernel=tboot.b00
kernelopt=runweasel ks=nfs://192.168.3.1/nfs/pxe/ks_esxi.cfg
modules=b.b00 --- jumpstrt.gz --- useropts.gz --- k.b00 --- chardevs.b00 --- a.b00 --- user.b00 --- uc_intel.b00 --- uc_amd.b00 --- sb.v00 --- s.v00 --- lsi_mr3.v00 --- lsi_msgp.v00 --- lsi_msgp.v01 --- bnxtnet.v00 --- net_tg3.v00 --- brcmfcoe.v00 --- elxnet.v00 --- ima_be2i.v00 --- lpfc.v00 --- scsi_be2.v00 --- i40en.v00 --- igbn.v00 --- ixgben.v00 --- concrete.v00 --- filetran.v00 --- fupb.v00 --- fwupdate.v00 --- immpasst.v00 --- pciinfo.v00 --- nmlx4_co.v00 --- nmlx4_en.v00 --- nmlx4_rd.v00 --- nmlx5_co.v00 --- qedentv.v00 --- qedf.v00 --- scsi_qed.v00 --- misc_cni.v00 --- net_bnx2.v00 --- net_bnx2.v01 --- net_cnic.v00 --- qlnative.v00 --- scsi_bnx.v00 --- scsi_bnx.v01 --- mtip32xx.v00 --- ata_pata.v00 --- ata_pata.v01 --- ata_pata.v02 --- ata_pata.v03 --- ata_pata.v04 --- ata_pata.v05 --- ata_pata.v06 --- ata_pata.v07 --- block_cc.v00 --- ehci_ehc.v00 --- emulex_e.v00 --- weaselin.t00 --- esx_dvfi.v00 --- esx_ui.v00 --- ima_qla4.v00 --- ipmi_ipm.v00 --- ipmi_ipm.v01 --- ipmi_ipm.v02 --- lsu_hp_h.v00 --- lsu_lsi_.v00 --- lsu_lsi_.v01 --- lsu_lsi_.v02 --- lsu_lsi_.v03 --- lsu_lsi_.v04 --- misc_dri.v00 --- net_e100.v00 --- net_e100.v01 --- net_enic.v00 --- net_forc.v00 --- net_igb.v00 --- net_mlx4.v00 --- net_mlx4.v01 --- net_nx_n.v00 --- net_vmxn.v00 --- nvme.v00 --- ohci_usb.v00 --- rste.v00 --- sata_ahc.v00 --- sata_ata.v00 --- sata_sat.v00 --- sata_sat.v01 --- sata_sat.v02 --- sata_sat.v03 --- sata_sat.v04 --- scsi_aac.v00 --- scsi_adp.v00 --- scsi_aic.v00 --- scsi_fni.v00 --- scsi_hps.v00 --- scsi_ips.v00 --- scsi_meg.v00 --- scsi_meg.v01 --- scsi_meg.v02 --- scsi_mpt.v00 --- scsi_mpt.v01 --- scsi_mpt.v02 --- scsi_qla.v00 --- uhci_usb.v00 --- vsan.v00 --- vsanheal.v00 --- vsanmgmt.v00 --- xhci_xhc.v00 --- tools.t00 --- lnvcusto.v00 --- xorg.v00 --- imgdb.tgz --- imgpayld.tgz
build=
updated=0
3、修改esxi的kickstart配置文件 /nfs/pxe/ks_esxi.cfg,内容很简单,这个配置只定义了接受用户协议,在第一块硬盘执行覆盖安装,设置root密码为abcd1234并在安装完成后自动重启。
accepteula
install --firstdisk --overwritevmfs
rootpw abcd1234
reboot
4、修改 /etc/dhcp/dhcpd.conf ,由原来的 filename "images/clonezilla/grubx64.efi" 改成 filename "images/esxi60u3/bootx64.efi",然后重启 dhcpd服务。dhcpd服务重启完之后,机器在clonezilla执行完jbod.sh重启之后就会开始自动获取esxi的efi引导文件,并开始自动进行esxi的批量安装部署了。
在安装完成之后服务器会自动重启,然后会自动引导刚安装完的esxi,因为安装esxi之后会生成esxi的efi引导项,服务器在没有引导项的时候才会从网卡PXE启动。
最后来总结一下,此次实施主要是利用PXE,先引导一个live模式的linux全自动运行storcli来修改RAID配置,然后利用PXE引导esxi安装程序通过kickstart进行全自动esxi安装部署。
storcli 的功能非常强大,本文中只用到了它开始RAID控制器jbod模式的功能,划分RAID配VD等这些都不在话下,有兴趣可以看一下broadcom官网的文档。
“zhufeng的小站”授权转载 觉得本文有用,请转发或点击“在看”,让更多同行看到
欢迎关注社区 “系统运维”技术主题 ,将会不断更新优质资料、文章。地址:
http://www.talkwithtrend.com/Topic/199
下载 twt 社区客户端 APP
长按识别二维码即可下载
或到应用商店搜索“twt”
长按二维码关注公众号
*本公众号所发布内容仅代表作者观点,不代表社区立场