Lakukan-sendiri-Bare-Metal Provisioning, atau persiapan server otomatis dari awal

Hai, saya Denis dan salah satu bidang kegiatan saya adalah pengembangan solusi infrastruktur di X5. Hari ini saya ingin berbagi dengan Anda tentang bagaimana Anda dapat menggunakan sistem persiapan server otomatis berdasarkan alat yang tersedia untuk umum. Menurut saya, ini adalah solusi yang menarik, sederhana dan fleksibel.



Dengan persiapan dimaksudkan: untuk membuat dari server baru di luar kotak, server yang sepenuhnya dikonfigurasi dengan OS Linux atau dengan hypervisor ESXi (casting server Windows tidak dibahas dalam artikel ini).

Ketentuan :

  • server - server yang perlu dikonfigurasi.
  • server instalasi - server utama yang menyediakan seluruh proses persiapan melalui jaringan.

Mengapa Anda membutuhkan otomatisasi?


Katakanlah ada masalah: massa menyiapkan server dari awal, pada puncaknya - 30 per hari. Server dari berbagai produsen dan model, OS yang berbeda dapat diinstal pada mereka, hypervisor mungkin ada atau mungkin tidak ada.

Operasi apa yang termasuk dalam proses pengaturan (tanpa otomatisasi):

  • sambungkan keyboard, mouse, monitor ke server;
  • mengkonfigurasi BIOS, RAID, IPMI;
  • meng-upgrade firmware komponen;
  • menyebarkan gambar sistem file (atau menginstal hypervisor dan menyalin mesin virtual);

Catatan. Atau, menyebarkan OS dimungkinkan melalui instalasi dengan file jawab otomatis. Tetapi ini tidak akan dibahas dalam artikel. Meskipun Anda akan melihat di bawah ini menambahkan fungsi ini mudah.

  • konfigurasikan parameter OS (nama host, IP, dll.).

Dengan pendekatan ini, pengaturan yang sama dilakukan secara berurutan di setiap server. Efektivitas pekerjaan semacam itu sangat rendah.

Inti dari otomatisasi adalah untuk mengecualikan keterlibatan manusia dari proses mempersiapkan server. Sebanyak mungkin.

Berkat otomatisasi, waktu henti antar operasi berkurang dan menjadi mungkin untuk menyiapkan beberapa server pada saat yang bersamaan. Kemungkinan kesalahan karena faktor manusia juga sangat berkurang.



Bagaimana server dikonfigurasi secara otomatis?


Kami akan menganalisis semua langkah secara rinci.

Anda memiliki server linux yang Anda gunakan sebagai server instalasi PXE. Layanan diinstal dan dikonfigurasi di dalamnya: DHCP, TFTP.

Jadi, kami memuat server (yang perlu dikonfigurasi) oleh PXE. Ingat cara kerjanya:

  • Server dipilih untuk mem-boot melalui jaringan.
  • Server memuat PXE-ROM kartu jaringan dan menghubungi server instalasi melalui DHCP untuk mendapatkan alamat jaringan.
  • DHCP dari server instalasi memberikan alamat, serta instruksi untuk mengunduh lebih lanjut melalui PXE.
  • Server mengunduh bootloader jaringan dari server instalasi melalui PXE, unduhan lebih lanjut terjadi sesuai dengan file konfigurasi PXE.
  • Pengunduhan dilakukan berdasarkan parameter yang diterima (kernel, initramfs, poin mount, gambar squashfs, dll.).

Catatan. Artikel ini menjelaskan boot PXE melalui mode BIOS. Saat ini, pabrikan secara aktif memperkenalkan bootmode UEFI. Untuk PXE, perbedaannya terletak pada konfigurasi server DHCP dan keberadaan bootloader tambahan.

Pertimbangkan contoh konfigurasi server PXE (menu pxelinux).

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

File 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=”…”

Kernel dan initramfs pada tahap ini adalah image linux menengah, dengan bantuan persiapan dasar dan konfigurasi server akan berlangsung.

Seperti yang Anda lihat, bootloader memberikan banyak parameter ke kernel. Beberapa parameter ini digunakan oleh kernel itu sendiri. Dan kita dapat menggunakan beberapa untuk tujuan kita sendiri. Ini akan dijelaskan nanti, tetapi untuk sekarang Anda hanya dapat mengingat bahwa semua parameter yang dilewati akan tersedia di image linux perantara via / proc / cmdline.

Di mana mendapatkannya, kernel dan initramfs?
Sebagai dasar, Anda dapat memilih distribusi linux apa pun. Apa yang kami perhatikan ketika memilih:

  • image boot harus universal (driver tersedia, kemampuan untuk menginstal utilitas tambahan);
  • kemungkinan besar, initramfs perlu disesuaikan.

Bagaimana ini dilakukan dalam solusi kami untuk X5? Kami memilih CentOS 7. sebagai dasarnya. Mari kita lakukan trik berikut: menyiapkan struktur gambar masa depan, masukkan ke dalam arsip dan buat initramfs, yang di dalamnya akan menjadi arsip sistem file kami. Saat memuat gambar, arsip akan digunakan untuk bagian tmpfs yang dibuat. Dengan demikian, kita mendapatkan gambar live-linux minimal, tetapi lengkap dengan semua utilitas yang diperlukan, yang terdiri dari hanya dua file: vmkernel dan 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

Jadi, kami telah menentukan kernel dan initramfs yang harus dimuat. Alhasil, pada tahap ini, mengunduh citra linux perantara melalui PXE, kami mendapatkan konsol OS.

Hebat, tapi sekarang kita perlu mentransfer kontrol ke "otomatisasi" kita.

Itu bisa dilakukan seperti ini.

Misalkan, setelah memuat gambar, kami berencana untuk mentransfer kontrol ke skrip mount.sh.
Kami menyertakan skrip mount.sh di autorun. Untuk melakukan ini, Anda perlu memodifikasi initramfs:

  • bongkar initramfs (jika kita menggunakan initramfs versi di atas, ini tidak diperlukan)
  • termasuk dalam kode startup yang akan menganalisis parameter yang melewati / proc / cmdline dan kontrol transfer lebih lanjut;
  • kemas initramfs.

Catatan. Dalam kasus toolkit X5, kontrol boot ditransfer ke skrip. /opt/x5/toolkit/bin/hook.sh override.conf getty tty1 (ExecStart=…)

Jadi, gambar dimuat, di mana skrip mount.sh dimulai saat startup. Selanjutnya, skrip mount.sh dalam proses analisis menganalisis parameter yang dikirimkan (script_cmd =) dan meluncurkan program / skrip yang diperlukan.

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



Berikut di sisi kiri adalah menu PXE , di sebelah kanan adalah skema transfer kontrol.

Dengan transfer kontrol, kami menemukan jawabannya. Bergantung pada pilihan menu PXE, skrip penyetelan otomatis atau konsol debugging diluncurkan.

Dalam hal konfigurasi otomatis, direktori yang diperlukan dari server instalasi dipasang, di mana terdapat:

  • skrip;
  • template BIOS / UEFI yang disimpan dari berbagai server;
  • firmware;
  • utilitas untuk server;
  • log.

Selanjutnya, skrip mount.sh mentransfer kontrol ke skrip master-install.sh dari direktori skrip.

Skrip pohon (urutan peluncurannya) terlihat seperti ini:

  • master-instal
  • fungsi berbagi (fungsi umum)
  • info (keluaran informasi)
  • model (pengaturan parameter instalasi berdasarkan model server)
  • prep_utils (menginstal utilitas yang diperlukan)
  • fwupdate (pembaruan firmware)
  • diag (diagnosis dasar)
  • biosconf (pengaturan BIOS / UEFI)
  • clockfix (pengaturan waktu pada motherboard)
  • srmconf (mengkonfigurasi antarmuka jarak jauh)
  • raidconf (mengkonfigurasi volume logis)

satu dari:

  • pra-instal (mentransfer kontrol ke installer OS atau hypervisor, misalnya ESXi)
  • bergabung-instal (mulai langsung membongkar gambar)

Sekarang kita tahu:

  • cara mem-boot server melalui PXE;
  • cara mentransfer kontrol ke skrip Anda sendiri.

Ayo lanjutkan. Masalah-masalah berikut telah menjadi relevan:

  • Bagaimana cara mengidentifikasi server yang kami siapkan?
  • Utilitas apa dan bagaimana mengkonfigurasi server?
  • Bagaimana cara mendapatkan pengaturan untuk server tertentu?

Bagaimana cara mengidentifikasi server yang kami siapkan?


Sederhana - DMI:

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

Ia memiliki semua yang Anda butuhkan: vendor, model, nomor seri. Jika Anda tidak yakin bahwa informasi ini disajikan di semua server, Anda dapat mengidentifikasi mereka berdasarkan alamat MAC. Atau dalam kedua cara pada saat yang sama jika vendor server berbeda dan pada beberapa model informasi nomor seri sama sekali tidak tersedia.

Berdasarkan informasi yang diterima, folder jaringan dari server instalasi sudah terpasang dan semua yang diperlukan dimuat (utilitas, firmware, dll.).

Utilitas apa dan bagaimana mengkonfigurasi server?


Saya akan memberikan utilitas untuk linux untuk beberapa produsen. Semua utilitas tersedia di situs web resmi vendor.



Dengan firmware, saya pikir semuanya jelas. Mereka biasanya datang dalam paket executable. File yang dapat dieksekusi mengontrol proses pembaruan firmware dan melaporkan kode pengembalian.

BIOS dan IPMI biasanya dikonfigurasi melalui template. Jika perlu, templat dapat diedit sebelum memuat.

Utilitas RAID untuk beberapa vendor juga dapat mengonfigurasi sesuai dengan templat. Jika bukan ini masalahnya, Anda harus menulis skrip konfigurasi.

Prosedur untuk mengkonfigurasi RAID paling sering adalah sebagai berikut:

  • Kami meminta konfigurasi saat ini.
  • Jika sudah ada array logis, kami menghapusnya.
  • Kami melihat disk fisik apa yang ada dan berapa banyak.
  • Buat array logis baru. Kami menghentikan proses jika terjadi kesalahan.

Bagaimana cara mendapatkan pengaturan untuk server tertentu?


Misalkan semua pengaturan server disimpan di server instalasi. Dalam hal ini, untuk menjawab pertanyaan kami, pertama-tama Anda harus memutuskan: cara mentransfer pengaturan ke server instalasi.

Pada awalnya, sangat mungkin dilakukan dengan file teks. (Di masa mendatang, Anda dapat menggunakan file teks sebagai cara cadangan untuk mentransfer pengaturan).

Anda dapat "berbagi" file teks di server instalasi. Dan tambahkan ke skrip mount.sh.

Baris akan, misalnya, terlihat seperti ini:

<nomor seri> <nama host> <subnet>

Baris ini akan ditransfer ke file oleh insinyur dari mesin kerjanya. Dan kemudian, ketika mengatur server, parameter untuk server tertentu akan dibaca dari file.

Tetapi, di masa depan, lebih baik menggunakan database untuk menyimpan pengaturan, status dan log instalasi server.

Tentu saja, satu basis data tidak dapat melakukannya, dan Anda harus membuat bagian klien, dengan bantuan yang pengaturannya akan ditransfer ke basis data. Ini lebih sulit untuk diimplementasikan daripada file teks, tetapi sebenarnya tidak sesulit kedengarannya. Versi minimum klien, yang hanya akan mentransfer data ke database, cukup layak untuk ditulis sendiri. Di masa mendatang, akan dimungkinkan untuk meningkatkan program klien juga dalam mode bebas (laporan, pencetakan label, mengirim pemberitahuan, dll., Apa pun yang terlintas dalam pikiran).

Setelah membuat permintaan khusus ke database dan menunjukkan nomor seri server, kami mendapatkan parameter yang diperlukan untuk mengkonfigurasi server.

Plus, kita tidak perlu menemukan kunci untuk akses simultan, seperti halnya dengan file teks.

Kita dapat menulis log konfigurasi di semua tahapan dalam basis data dan mengontrol proses instalasi melalui peristiwa dan tanda pada tahap persiapan.

Sekarang kita tahu caranya:

  • memuat server melalui PXE;
  • mentransfer kendali ke skrip kami;
  • mengidentifikasi server yang akan disiapkan dengan nomor seri;
  • mengkonfigurasi server dengan utilitas yang sesuai;
  • mentransfer pengaturan ke database server instalasi menggunakan bagian klien.

Menemukan caranya:

  • server yang diinstal menerima pengaturan yang diperlukan dari basis data;
  • semua kemajuan persiapan dicatat dalam database (log, acara, bendera panggung).

Bagaimana dengan berbagai jenis perangkat lunak yang diinstal? Bagaimana cara menginstal hypervisor, menyalin VM dan mengkonfigurasi semua ini?


Dalam hal penggelaran gambar sistem file (linux) ke perangkat keras, semuanya cukup sederhana:

  • Setelah mengatur semua komponen server, gunakan gambar.
  • Instal grload bootloader.
  • Kami membuat chroot dan mengonfigurasi semua yang diperlukan.

Cara mentransfer kontrol ke penginstal OS (menggunakan ESXi sebagai contoh).

  • Kami mengatur transfer kontrol dari skrip kami ke pemasang hypervisor menggunakan file respons otomatis (kickstart):
  • Hapus partisi saat ini di disk.
  • Buat partisi 500MB.
  • Kami menandainya sebagai boot.
  • Format dalam FAT32.
  • Kami menyalin file instalasi ESXi ke root.
  • Instal syslinux.
  • Salin syslinux.cfg ke / syslinux /

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

  • Salin mboot.c32 ke / syslinux.
  • Di boot.cfg harus ada kernelopt = ks = ftp: // <IP server instalasi> /ks_esxi.cfg
  • Nyalakan ulang server.

Setelah server reboot, penginstal ESXi akan mem-boot dari hard drive-nya. Semua file installer yang diperlukan akan dimuat ke dalam memori dan instalasi ESXi akan dimulai, sesuai dengan file jawab otomatis yang ditentukan.

Berikut adalah beberapa baris dari file jawaban otomatis 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

Pada tahap ini, hypervisor diinstal dan dikonfigurasi, mesin virtual disalin.

Bagaimana cara mengkonfigurasi mesin virtual sekarang?

Kami sedikit curang: selama instalasi kami mengatur guestinfo.esxihost.id = "$ SYSSN" parameter dalam file VM1.vmx, menunjukkan nomor seri server fisik di dalamnya.

Sekarang, setelah memulai, mesin virtual (dengan paket vmware-tools diinstal) dapat mengakses parameter ini:

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

Artinya, VM akan dapat mengidentifikasi dirinya sendiri (ia tahu nomor seri host fisik), membuat permintaan ke database server instalasi dan mendapatkan parameter yang perlu dikonfigurasi. Ini semua dieksekusi dalam skrip yang harus diluncurkan secara otomatis ketika guestos vm dimulai (tetapi sekali: RunOnce).

Sekarang kita tahu caranya:

  • memuat server melalui PXE;
  • mentransfer kendali ke skrip kami;
  • mengidentifikasi server yang akan disiapkan dengan nomor seri;
  • mengkonfigurasi server dengan utilitas yang sesuai;
  • mentransfer pengaturan ke database server instalasi menggunakan bagian klien;
  • Mengkonfigurasi berbagai jenis PO, termasuk menggunakan esxi hypervisor dan mengkonfigurasi mesin virtual (dan semuanya secara otomatis).

Menemukan caranya:

  • server yang diinstal menerima pengaturan yang diperlukan dari basis data;
  • semua kemajuan persiapan dicatat dalam database (log, acara, bendera panggung).

Intinya:

Saya percaya keunikan solusi ini terletak pada fleksibilitas, kesederhanaan, kemampuan dan fleksibilitasnya.

Silakan tulis di komentar apa pendapat Anda.

All Articles