การจัดเตรียม Bare-Metal ด้วยตนเอง หรือการเตรียมเซิร์ฟเวอร์อัตโนมัติตั้งแต่เริ่มต้น

สวัสดี ฉันชื่อเดนิส กิจกรรมอย่างหนึ่งของฉันคือการพัฒนาโซลูชันโครงสร้างพื้นฐานที่ X5 วันนี้ฉันอยากจะแบ่งปันกับคุณว่าคุณสามารถปรับใช้ระบบการเตรียมเซิร์ฟเวอร์อัตโนมัติโดยอาศัยเครื่องมือที่เปิดเผยต่อสาธารณะได้อย่างไร ในความคิดของฉัน นี่เป็นวิธีแก้ปัญหาที่น่าสนใจ เรียบง่าย และยืดหยุ่น

การจัดเตรียม Bare-Metal ด้วยตนเอง หรือการเตรียมเซิร์ฟเวอร์อัตโนมัติตั้งแต่เริ่มต้น

ในการเตรียมการ เราหมายถึง: เปลี่ยนเซิร์ฟเวอร์ใหม่ตั้งแต่แกะกล่องให้เป็นเซิร์ฟเวอร์ที่ได้รับการกำหนดค่าอย่างสมบูรณ์พร้อมระบบปฏิบัติการ Linux หรือกับไฮเปอร์ไวเซอร์ ESXi (การปรับใช้เซิร์ฟเวอร์ Windows ไม่ได้กล่าวถึงในบทความนี้)

ข้อตกลงและเงื่อนไข:

  • เซิร์ฟเวอร์ – เซิร์ฟเวอร์ที่ต้องกำหนดค่า
  • เซิร์ฟเวอร์การติดตั้งเป็นเซิร์ฟเวอร์หลักที่ให้กระบวนการเตรียมการทั้งหมดผ่านเครือข่าย

เหตุใดจึงจำเป็นต้องมีระบบอัตโนมัติ?

สมมติว่ามีงานหนึ่ง: เตรียมเซิร์ฟเวอร์จำนวนมากตั้งแต่เริ่มต้นที่ระดับสูงสุด - 30 เซิร์ฟเวอร์ต่อวัน เซิร์ฟเวอร์ของผู้ผลิตและรุ่นที่แตกต่างกัน ระบบปฏิบัติการที่แตกต่างกันอาจถูกติดตั้งไว้ และอาจมีหรือไม่มีไฮเปอร์ไวเซอร์

การดำเนินการใดบ้างที่รวมอยู่ในกระบวนการตั้งค่า (ไม่มีระบบอัตโนมัติ):

  • เชื่อมต่อคีย์บอร์ด เมาส์ จอภาพ เข้ากับเซิร์ฟเวอร์
  • กำหนดค่า BIOS, RAID, IPMI;
  • อัพเดตเฟิร์มแวร์ส่วนประกอบ
  • ปรับใช้อิมเมจระบบไฟล์ (หรือติดตั้งไฮเปอร์ไวเซอร์และคัดลอกเครื่องเสมือน)

บันทึก. อีกทางหนึ่ง การปรับใช้ OS สามารถทำได้ผ่านการติดตั้งด้วยไฟล์ตอบกลับอัตโนมัติ แต่จะไม่มีการกล่าวถึงเรื่องนี้ในบทความ แม้ว่าคุณจะเห็นด้านล่างว่าการเพิ่มฟังก์ชันนี้ไม่ใช่เรื่องยาก

  • กำหนดค่าพารามิเตอร์ระบบปฏิบัติการ (ชื่อโฮสต์, IP ฯลฯ )

ด้วยแนวทางนี้ การตั้งค่าเดียวกันจะดำเนินการตามลำดับบนแต่ละเซิร์ฟเวอร์ ประสิทธิภาพของงานดังกล่าวต่ำมาก

สาระสำคัญของระบบอัตโนมัติคือการขจัดการมีส่วนร่วมของมนุษย์ออกจากกระบวนการเตรียมเซิร์ฟเวอร์ มากที่สุดเท่าที่เป็นไปได้.

ระบบอัตโนมัติช่วยลดเวลาหยุดทำงานระหว่างการดำเนินงาน และทำให้สามารถจัดเตรียมเซิร์ฟเวอร์หลายเครื่องพร้อมกันได้ โอกาสที่จะเกิดข้อผิดพลาดอันเนื่องมาจากปัจจัยมนุษย์ก็ลดลงอย่างมากเช่นกัน

การจัดเตรียม Bare-Metal ด้วยตนเอง หรือการเตรียมเซิร์ฟเวอร์อัตโนมัติตั้งแต่เริ่มต้น

เซิร์ฟเวอร์ได้รับการกำหนดค่าโดยอัตโนมัติอย่างไร

มาวิเคราะห์ทุกขั้นตอนอย่างละเอียด

คุณมีเซิร์ฟเวอร์ Linux ที่คุณใช้เป็นเซิร์ฟเวอร์การติดตั้ง PXE มีการติดตั้งและกำหนดค่าบริการ: DHCP, TFTP

ดังนั้นเราจึงบูตเซิร์ฟเวอร์ (ซึ่งจำเป็นต้องกำหนดค่า) ผ่าน PXE จำไว้ว่ามันทำงานอย่างไร:

  • เลือกการบูตเครือข่ายบนเซิร์ฟเวอร์
  • เซิร์ฟเวอร์จะโหลด PXE-ROM ของการ์ดเครือข่ายและติดต่อเซิร์ฟเวอร์การติดตั้งผ่าน DHCP เพื่อรับที่อยู่เครือข่าย
  • เซิร์ฟเวอร์การติดตั้ง DHCP จะออกที่อยู่ รวมถึงคำแนะนำในการดาวน์โหลดเพิ่มเติมผ่าน PXE
  • เซิร์ฟเวอร์โหลด bootloader เครือข่ายจากเซิร์ฟเวอร์การติดตั้งผ่าน PXE การโหลดเพิ่มเติมจะเกิดขึ้นตามไฟล์การกำหนดค่า PXE
  • การบู๊ตเกิดขึ้นตามพารามิเตอร์ที่ได้รับ (เคอร์เนล, initramfs, จุดเชื่อมต่อ, อิมเมจ squashfs ฯลฯ )

บันทึก. บทความนี้จะอธิบายการบูทผ่าน PXE ผ่านโหมด BIOS ปัจจุบันผู้ผลิตกำลังใช้งานโหมดการบูต UEFI อย่างแข็งขัน สำหรับ PXE ความแตกต่างจะอยู่ในการกำหนดค่าเซิร์ฟเวอร์ DHCP และการมีอยู่ของ bootloader เพิ่มเติม

ลองดูตัวอย่างการกำหนดค่าเซิร์ฟเวอร์ PXE (เมนู pxelinux)

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

ไฟล์ 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 ระดับกลาง ซึ่งจะมีการเตรียมการหลักและการกำหนดค่าของเซิร์ฟเวอร์

อย่างที่คุณเห็น bootloader ส่งพารามิเตอร์จำนวนมากไปยังเคอร์เนล เคอร์เนลเองใช้พารามิเตอร์เหล่านี้บางส่วน และเราสามารถใช้บางอย่างเพื่อจุดประสงค์ของเราเองได้ เราจะหารือเรื่องนี้ในภายหลัง แต่สำหรับตอนนี้ คุณคงจำได้ว่าพารามิเตอร์ที่ส่งผ่านทั้งหมดจะพร้อมใช้งานในอิมเมจ Linux ระดับกลางผ่าน /proc/cmdline

ฉันจะหาเคอร์เนลและ initramfs ได้ที่ไหน
โดยพื้นฐานแล้ว คุณสามารถเลือกการกระจาย Linux ใดก็ได้ สิ่งที่เราใส่ใจเมื่อเลือก:

  • อิมเมจสำหรับบูตจะต้องเป็นสากล (ความพร้อมใช้งานของไดรเวอร์, ความสามารถในการติดตั้งยูทิลิตี้เพิ่มเติม);
  • เป็นไปได้มากที่คุณจะต้องปรับแต่ง initramfs

สิ่งนี้ทำได้อย่างไรในโซลูชันของเราสำหรับ X5 เป็นพื้นฐานเลือก CentOS 7 ลองใช้เคล็ดลับต่อไปนี้: เตรียมโครงสร้างภาพในอนาคตบรรจุลงในไฟล์เก็บถาวรและสร้าง initramfs ซึ่งภายในนั้นจะมีไฟล์เก็บถาวรระบบไฟล์ของเรา เมื่อโหลดรูปภาพ ไฟล์เก็บถาวรจะถูกขยายไปยังพาร์ติชัน tmpfs ที่สร้างขึ้น ด้วยวิธีนี้เราจะได้อิมเมจลินุกซ์สดขั้นต่ำ แต่เต็มเปี่ยมพร้อมยูทิลิตี้ที่จำเป็นทั้งหมดซึ่งประกอบด้วยไฟล์เพียงสองไฟล์เท่านั้น: 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 เราจะได้รับคอนโซลระบบปฏิบัติการ

เยี่ยมเลย แต่ตอนนี้เราต้องถ่ายโอนการควบคุมไปยัง "ระบบอัตโนมัติ" ของเรา

ก็สามารถทำได้เช่นนี้

สมมติว่าหลังจากโหลดรูปภาพแล้ว เราวางแผนที่จะถ่ายโอนการควบคุมไปยังสคริปต์ 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=scripts/mount.sh script_cmd=master-install.sh

ชุดเครื่องมือฉลาก-เปลือก
เคอร์เนล...
ผนวก... nfs_toolkit_script=scripts/mount.sh script_cmd=/bin/bash.script_cmd=/bin/bash

การจัดเตรียม Bare-Metal ด้วยตนเอง หรือการเตรียมเซิร์ฟเวอร์อัตโนมัติตั้งแต่เริ่มต้น

ทางด้านซ้ายคือเมนู PXE ทางด้านขวาคือไดอะแกรมการถ่ายโอนการควบคุม

เราพบการถ่ายโอนการควบคุม ขึ้นอยู่กับตัวเลือกของเมนู PXE จะมีการเรียกใช้สคริปต์การกำหนดค่าอัตโนมัติหรือคอนโซลการดีบัก

ในกรณีของการกำหนดค่าอัตโนมัติ ไดเร็กทอรีที่จำเป็นจะถูกเมาท์จากเซิร์ฟเวอร์การติดตั้ง ซึ่งประกอบด้วย:

  • สคริปต์;
  • เทมเพลต BIOS/UEFI ที่บันทึกไว้สำหรับเซิร์ฟเวอร์ต่างๆ
  • เฟิร์มแวร์;
  • ยูทิลิตี้เซิร์ฟเวอร์
  • บันทึก

ถัดไป สคริปต์ mount.sh ถ่ายโอนการควบคุมไปยังสคริปต์ master-install.sh จากไดเร็กทอรีสคริปต์

แผนผังสคริปต์ (ลำดับที่เรียกใช้) มีลักษณะดังนี้:

  • ต้นแบบการติดตั้ง
  • sharefunctions (ฟังก์ชันที่ใช้ร่วมกัน)
  • ข้อมูล (ข้อมูลที่ส่งออก)
  • รุ่น (การตั้งค่าพารามิเตอร์การติดตั้งตามรุ่นเซิร์ฟเวอร์)
  • เตรียม_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 ให้กับผู้ผลิตบางราย สาธารณูปโภคทั้งหมดมีอยู่บนเว็บไซต์อย่างเป็นทางการของผู้ขาย

การจัดเตรียม Bare-Metal ด้วยตนเอง หรือการเตรียมเซิร์ฟเวอร์อัตโนมัติตั้งแต่เริ่มต้น

ด้วยเฟิร์มแวร์ฉันคิดว่าทุกอย่างชัดเจน มักจะมาในรูปแบบของไฟล์ปฏิบัติการแบบแพ็กเกจ ไฟล์ปฏิบัติการจะควบคุมกระบวนการอัพเดตเฟิร์มแวร์และรายงานโค้ดส่งคืน

โดยปกติแล้ว BIOS และ IPMI จะได้รับการกำหนดค่าผ่านเทมเพลต หากจำเป็น คุณสามารถแก้ไขเทมเพลตก่อนดาวน์โหลดได้

ยูทิลิตี้ RAID จากผู้จำหน่ายบางรายสามารถกำหนดค่าได้โดยใช้เทมเพลต หากไม่เป็นเช่นนั้น คุณจะต้องเขียนสคริปต์การกำหนดค่า

ขั้นตอนการตั้งค่า RAID มักเป็นดังนี้:

  • เราขอการกำหนดค่าปัจจุบัน
  • หากมีอาร์เรย์ลอจิคัลอยู่แล้ว เราจะลบออก
  • มาดูกันว่ามีฟิสิคัลดิสก์ใดบ้างและมีกี่ดิสก์
  • สร้างอาร์เรย์ลอจิคัลใหม่ เราขัดจังหวะกระบวนการในกรณีที่เกิดข้อผิดพลาด

จะรับการตั้งค่าสำหรับเซิร์ฟเวอร์เฉพาะได้อย่างไร?

สมมติว่าการตั้งค่าของเซิร์ฟเวอร์ทั้งหมดจะถูกจัดเก็บไว้ในเซิร์ฟเวอร์การติดตั้ง ในกรณีนี้ เพื่อตอบคำถามของเรา เราต้องตัดสินใจก่อนว่าจะถ่ายโอนการตั้งค่าไปยังเซิร์ฟเวอร์การติดตั้งอย่างไร

ในตอนแรกคุณสามารถใช้ไฟล์ข้อความได้ (ในอนาคต คุณอาจต้องการใช้ไฟล์ข้อความเป็นวิธีสำรองในการถ่ายโอนการตั้งค่า)

คุณสามารถ "แชร์" ไฟล์ข้อความบนเซิร์ฟเวอร์การติดตั้งได้ และเพิ่มการเมานต์ลงในสคริปต์ mount.sh

เส้นจะมีลักษณะดังนี้:

<หมายเลขซีเรียล> <ชื่อโฮสต์> <ซับเน็ต>

เส้นเหล่านี้จะถูกถ่ายโอนไปยังไฟล์โดยวิศวกรจากเครื่องจักรที่ทำงานของเขา จากนั้นเมื่อตั้งค่าเซิร์ฟเวอร์ พารามิเตอร์สำหรับเซิร์ฟเวอร์เฉพาะจะถูกอ่านจากไฟล์

แต่ในระยะยาว จะดีกว่าถ้าใช้ฐานข้อมูลเพื่อจัดเก็บการตั้งค่า สถานะ และบันทึกการติดตั้งเซิร์ฟเวอร์

แน่นอนว่าฐานข้อมูลเพียงอย่างเดียวไม่เพียงพอ และคุณจะต้องสร้างส่วนของไคลเอนต์ด้วยความช่วยเหลือในการโอนการตั้งค่าไปยังฐานข้อมูล นี่เป็นเรื่องยากกว่าเมื่อเปรียบเทียบกับไฟล์ข้อความ แต่จริงๆ แล้วทุกอย่างไม่ได้ยากอย่างที่คิด ค่อนข้างเป็นไปได้ที่จะเขียนเวอร์ชันขั้นต่ำของไคลเอนต์ที่จะถ่ายโอนข้อมูลไปยังฐานข้อมูลด้วยตัวคุณเอง และในอนาคตจะเป็นไปได้ที่จะปรับปรุงโปรแกรมไคลเอนต์ในโหมดฟรี (รายงาน การพิมพ์ฉลาก การส่งการแจ้งเตือน ฯลฯ ที่อยู่ในใจ)

ด้วยการร้องขอเฉพาะไปยังฐานข้อมูลและระบุหมายเลขซีเรียลของเซิร์ฟเวอร์ เราจะได้รับพารามิเตอร์ที่จำเป็นสำหรับการกำหนดค่าเซิร์ฟเวอร์

นอกจากนี้เรายังไม่จำเป็นต้องมีการล็อคสำหรับการเข้าถึงพร้อมกัน เช่นเดียวกับในกรณีของไฟล์ข้อความ

เราสามารถเขียนบันทึกการกำหนดค่าลงในฐานข้อมูลในทุกขั้นตอนและควบคุมกระบวนการติดตั้งผ่านเหตุการณ์และแฟล็กของขั้นตอนการจัดเตรียม

ตอนนี้เรารู้แล้วว่า:

  • บูตเซิร์ฟเวอร์ผ่าน PXE;
  • ถ่ายโอนการควบคุมไปยังสคริปต์ของเรา
  • ระบุเซิร์ฟเวอร์ที่ต้องเตรียมตามหมายเลขซีเรียล
  • กำหนดค่าเซิร์ฟเวอร์โดยใช้ยูทิลิตี้ที่เหมาะสม
  • ถ่ายโอนการตั้งค่าไปยังฐานข้อมูลเซิร์ฟเวอร์การติดตั้งโดยใช้ส่วนของไคลเอ็นต์

เราค้นพบวิธีการ:

  • เซิร์ฟเวอร์ที่ติดตั้งจะได้รับการตั้งค่าที่จำเป็นจากฐานข้อมูล
  • ความคืบหน้าในการเตรียมการทั้งหมดจะถูกบันทึกไว้ในฐานข้อมูล (บันทึก เหตุการณ์ ธงเวที)

แล้วซอฟต์แวร์ประเภทต่างๆ ที่คุณติดตั้งล่ะ? จะติดตั้งไฮเปอร์ไวเซอร์ คัดลอก VM และกำหนดค่าทั้งหมดได้อย่างไร

ในกรณีของการปรับใช้อิมเมจระบบไฟล์ (linux) กับฮาร์ดแวร์ ทุกอย่างค่อนข้างง่าย:

  • หลังจากตั้งค่าส่วนประกอบเซิร์ฟเวอร์ทั้งหมดแล้ว เราก็ปรับใช้อิมเมจ
  • ติดตั้งด้วง bootloader
  • เราทำการรูทและกำหนดค่าทุกสิ่งที่จำเป็น

วิธีถ่ายโอนการควบคุมไปยังตัวติดตั้งระบบปฏิบัติการ (โดยใช้ ESXi เป็นตัวอย่าง)

  • เราจัดระเบียบการถ่ายโอนการควบคุมจากสคริปต์ของเราไปยังตัวติดตั้งไฮเปอร์ไวเซอร์โดยใช้ไฟล์ตอบกลับอัตโนมัติ (คิกสตาร์ท):
  • เราลบพาร์ติชันปัจจุบันบนดิสก์
  • สร้างพาร์ติชันที่มีขนาด 500MB
  • เราทำเครื่องหมายว่าสามารถบูตได้
  • จัดรูปแบบเป็น FAT32
  • เราคัดลอกไฟล์การติดตั้ง ESXi ไปที่รูท
  • การติดตั้งซิสลินุกซ์
  • คัดลอก 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:// /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:[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

ในขั้นตอนนี้ มีการติดตั้งและกำหนดค่าไฮเปอร์ไวเซอร์ และเครื่องเสมือนจะถูกคัดลอก

จะกำหนดค่าเครื่องเสมือนตอนนี้ได้อย่างไร?

เราโกงเล็กน้อย: ระหว่างการติดตั้งเราตั้งค่าพารามิเตอร์ guestinfo.esxihost.id = "$SYSSN" ในไฟล์ VM1.vmx และระบุหมายเลขซีเรียลของเซิร์ฟเวอร์ฟิสิคัลในนั้น

หลังจากเริ่มต้นแล้ว เครื่องเสมือน (ที่ติดตั้งแพ็คเกจ vmware-tools) จะสามารถเข้าถึงพารามิเตอร์นี้ได้:

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

นั่นคือ VM จะสามารถระบุตัวเองได้ (รู้หมายเลขซีเรียลของโฮสต์ฟิสิคัล) ส่งคำขอไปยังฐานข้อมูลเซิร์ฟเวอร์การติดตั้งและรับพารามิเตอร์ที่จำเป็นต้องกำหนดค่า ทั้งหมดนี้ถูกคอมไพล์เป็นสคริปต์ ซึ่งควรเปิดใช้งานโดยอัตโนมัติเมื่อ guestos vm เริ่มทำงาน (แต่ครั้งเดียว: RunOnce)

ตอนนี้เรารู้แล้วว่า:

  • บูตเซิร์ฟเวอร์ผ่าน PXE;
  • ถ่ายโอนการควบคุมไปยังสคริปต์ของเรา
  • ระบุเซิร์ฟเวอร์ที่ต้องเตรียมตามหมายเลขซีเรียล
  • กำหนดค่าเซิร์ฟเวอร์โดยใช้ยูทิลิตี้ที่เหมาะสม
  • ถ่ายโอนการตั้งค่าไปยังฐานข้อมูลเซิร์ฟเวอร์การติดตั้งโดยใช้ส่วนของไคลเอนต์
  • กำหนดค่าซอฟต์แวร์ประเภทต่างๆ รวมถึงการปรับใช้ไฮเปอร์ไวเซอร์ esxi และการกำหนดค่าเครื่องเสมือน (ทั้งหมดโดยอัตโนมัติ)

เราค้นพบวิธีการ:

  • เซิร์ฟเวอร์ที่ติดตั้งจะได้รับการตั้งค่าที่จำเป็นจากฐานข้อมูล
  • ความคืบหน้าในการเตรียมการทั้งหมดจะถูกบันทึกไว้ในฐานข้อมูล (บันทึก เหตุการณ์ ธงเวที)


บรรทัดด้านล่าง:

ฉันเชื่อว่าความเป็นเอกลักษณ์ของโซลูชันนี้อยู่ที่ความยืดหยุ่น ความเรียบง่าย ความสามารถ และความอเนกประสงค์

กรุณาเขียนความคิดเห็นในสิ่งที่คุณคิด

ที่มา: will.com

เพิ่มความคิดเห็น