{"id":74905,"date":"2020-03-21T20:42:25","date_gmt":"2020-03-21T17:42:25","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya"},"modified":"2020-03-21T20:42:25","modified_gmt":"2020-03-21T17:42:25","slug":"bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya","status":"publish","type":"post","link":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya","title":{"rendered":"Bare-Metal Provisioning zelf doen, of Automatische serverconfiguratie vanaf nul","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo, ik ben Denis en een van mijn aandachtsgebieden is het ontwikkelen van infrastructuuroplossingen bij X5. Vandaag wil ik delen hoe je met behulp van openbare tools een automatisch systeem voor serverconfiguratie kunt opzetten. Naar mijn mening is dit een interessante, eenvoudige en flexibele oplossing.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning zelf doen, of Automatische serverconfiguratie vanaf nul\" src=\"\/wp-content\/uploads\/2020\/03\/b49cca7e782c0875a95feee497f141b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nMet configuratie bedoelen we: een nieuwe server uit de doos omvormen tot een volledig geconfigureerde server met een Linux-besturingssysteem of met hypervisor ESXi (de installatie van <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/nl\/server\/\"   title=\"servers\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1469\">servers<\/a> Windows wordt in dit artikel niet besproken).<\/p>\n<p><b>Termen<\/b>:<\/p>\n<ul>\n<li>servers \u2013 servers die geconfigureerd moeten worden.<\/li>\n<li>install-server \u2013 de hoofdserver die het hele proces van netwerkinstallatie verzorgt.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Waarom is automatisering nodig?<\/h3>\n<p>\nStel, we hebben de taak om personeel om te zetten naar servers vanaf de basis, met een piek van 30 per dag. Servers van verschillende fabrikanten en modellen, die verschillende besturingssystemen kunnen hebben, met of zonder hypervisor.<\/p>\n<p>Welke handelingen zijn onderdeel van het configuratieproces (zonder automatisering):<\/p>\n<ul>\n<li>koppel een toetsenbord, muis en monitor aan de server;<\/li>\n<li>configureer BIOS, RAID, IPMI;<\/li>\n<li>update firmware van componenten;<\/li>\n<li>zet een image van het bestandssysteem op (of installeer de hypervisor en kopieer virtuele machines);<\/li>\n<\/ul>\n<p>\nOpmerking. In principe kan OS-deployment ook plaatsvinden via een installatie met een antwoordbestand. Maar dit zal in het artikel niet worden besproken. Maar je zult hieronder zien dat het toevoegen van deze functionaliteit niet moeilijk is.<\/p>\n<ul>\n<li>configureer de parameters van het besturingssysteem (hostname, IP, enz.).<\/li>\n<\/ul>\n<p>\nBij deze aanpak worden dezelfde instellingen opvolgend op elke server toegepast. De effectiviteit van dit werk is erg laag.<\/p>\n<p>De essentie van automatisering is om de menselijke betrokkenheid bij het configureren van de server te elimineren. Zo ver mogelijk. <\/p>\n<p>Dankzij automatisering wordt de stilstandtijd tussen handelingen verkort en kan je meerdere servers gelijktijdig configureren. Ook wordt de kans op fouten door menselijke factoren sterk verminderd.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning zelf doen, of Automatische serverconfiguratie vanaf nul\" src=\"\/wp-content\/uploads\/2020\/03\/8c196058891a7f41c5b93e7f6721480b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Hoe vindt automatische serverconfiguratie plaats?<\/h3>\n<p>\nLaten we alle stappen gedetailleerd doorlopen.<\/p>\n<p>Je hebt een Linux-server die je gebruikt als PXE-installatieserver. Hierop zijn de diensten DHCP en TFTP ge\u00efnstalleerd en geconfigureerd.<\/p>\n<p>Laten we de server (die geconfigureerd moet worden) dus opstarten via PXE. Laten we herinneren hoe dit werkt:<\/p>\n<ul>\n<li>Op de server is netwerkboot geselecteerd.<\/li>\n<li>De server laadt de PXE-ROM van de netwerkkaart en vraagt het installatieserver om een netwerkadres via DHCP.<\/li>\n<li>De DHCP van de installatieserver geeft een adres en ook instructies voor verdere opstart via PXE.<\/li>\n<li>De server laadt de netwerkopstartloader van de installatieserver via PXE, de verdere opstart gebeurt volgens het PXE-configuratiebestand.<\/li>\n<li>De opstart vindt plaats op basis van de ontvangen parameters (kern, initramfs, montagemogelijkheden, squashfs-beeld, enzovoort).<\/li>\n<\/ul>\n<p>\nOpmerking. Dit artikel beschrijft het opstarten via PXE in BIOS-modus. Fabrikanten implementeren momenteel actief de UEFI-bootmodus. Voor PXE zal het verschil zitten in de configuratie van de DHCP-server en de aanwezigheid van een extra opstartloader.<\/p>\n<p>Laten we een voorbeeld van een PXE-serverconfiguratie bekijken (pxelinux-menu).<\/p>\n<p>Bestand pxelinux.cfg\/default:<\/p>\n<pre><code class=\"plaintext\">default menu.c32\nprompt 0\ntimeout 100\nmenu title X5 PXE Boot Menu\nLABEL InstallServer Menu\n\tMENU LABEL InstallServer\n\tKERNEL menu.c32\n\tAPPEND pxelinux.cfg\/installserver\nLABEL VMware Menu\n\tMENU LABEL VMware ESXi Install\n\tKERNEL menu.c32\n\tAPPEND pxelinux.cfg\/vmware\nLABEL toolkit \/\/ standaardmenu\n\tMENU LABEL Linux Scripting Toolkits\n\tMENU default\n\tKERNEL menu.c32\n\tAPPEND pxelinux.cfg\/toolkit \/\/ overgang naar het volgende menu<\/code><\/pre>\n<p>\nBestand pxelinux.cfg\/toolkit:<\/p>\n<pre><code class=\"plaintext\">prompt 0\ntimeout 100\nmenu title X5 PXE Boot Menu\nlabel mainmenu\n    menu label ^Terug naar hoofdmenu\n    kernel menu.c32\n    append pxelinux.cfg\/default\nlabel x5toolkit-auto \/\/ standaard - automatische modus\n        menu label x5 toolkit autoinstall\n        menu default\n        kernel toolkit\/tkcustom-kernel\n        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=\"\u2026\"\nlabel x5toolkit-shell \/\/ voor debugging - console\n        menu label x5 toolkit shell\n        kernel toolkit\/tkcustom-kernel\n        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=\"\u2026\"<\/code><\/pre>\n<p>\nDe kernel en initramfs op dit punt zijn een tussenliggende linux-image, waarmee de hoofdconfiguratie en -instelling van de server zal plaatsvinden.<\/p>\n<p>Zoals u ziet, verstrekt de bootloader veel parameters aan de kernel. Een deel van deze parameters wordt door de kernel zelf gebruikt. En sommige kunnen we voor onze doeleinden gebruiken. Hierover zal later worden gesproken, maar voor nu kunt u gewoon onthouden dat alle doorgegeven parameters beschikbaar zullen zijn in de tussenliggende linux-image via \/proc\/cmdline.<\/p>\n<p>Waar krijgen we de kernel en initramfs vandaan?<br \/>\nU kunt elke linux-distributie als basis kiezen. Waar we op letten bij de keuze:<\/p>\n<ul>\n<li>de opstart-image moet universeel zijn (beschikbaarheid van stuurprogramma's, mogelijkheden om extra hulpprogramma's te installeren);<\/li>\n<li>waarschijnlijk moet initramfs worden aangepast.<\/li>\n<\/ul>\n<p>\nHoe is dit gedaan in onze oplossing voor X5? We hebben CentOS 7 als basis gekozen. We gaan de volgende truc gebruiken: we bereiden de toekomstige structuur van de afbeelding voor, verpakken deze in een archief en cre\u00ebren initramfs, waarin ons archief van het bestandssysteem zich bevindt. Bij het opstarten van de afbeelding wordt het archief uitgepakt in de te cre\u00ebren tmpfs-partitie. Op deze manier krijgen we een minimale, maar volwaardige live-linux afbeelding met alle benodigde hulpprogramma's, bestaande uit slechts twee bestanden: vmkernel en initramfs. <\/p>\n<pre><code class=\"plaintext\">#\u0441\u043e\u0437\u0434\u0430\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: \n\nmkdir -p \/tftpboot\/toolkit\/CustomTK\/rootfs \/tftpboot\/toolkit\/CustomTK\/initramfs\/bin\n\n#\u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:\n\nyum groups -y install &quot;Minimal Install&quot; --installroot=\/tftpboot\/toolkit\/CustomTK\/rootfs\/\nyum -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\/\nyum -y remove biosdevname --installroot=\/tftpboot\/toolkit\/CustomTK\/rootfs\/\n\n# \u043f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c initramfs:\n\nwget https:\/\/busybox.net\/downloads\/binaries\/1.31.0-defconfig-multiarch-musl\/busybox-x86_64 -O \/tftpboot\/toolkit\/CustomTK\/initramfs\/bin\/busybox\nchmod a+x \/tftpboot\/toolkit\/CustomTK\/initramfs\/bin\/busybox\ncp \/tftpboot\/toolkit\/CustomTK\/rootfs\/boot\/vmlinuz-3.10.0-957.el7.x86_64 \/tftpboot\/toolkit\/tkcustom-kernel\n\n# \u0441\u043e\u0437\u0434\u0430\u0435\u043c \/tftpboot\/toolkit\/CustomTK\/initramfs\/init (\u043d\u0438\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430):\n\n#!\/bin\/busybox sh\n\/bin\/busybox --install \/bin\nmkdir -p \/dev \/proc \/sys \/var\/run \/newroot\nmount -t proc proc \/proc\nmount -o mode=0755 -t devtmpfs devtmpfs \/dev\nmkdir -p \/dev\/pts \/dev\/shm \/dev\/mapper \/dev\/vc\nmount -t devpts -o gid=5,mode=620 devpts \/dev\/pts\nmount -t sysfs sysfs \/sys\nmount -t tmpfs -o size=4000m tmpfs \/newroot\necho -n &quot;Extracting rootfs... &quot;\nxz -d -c -f rootfs.tar.xz | tar -x -f - -C \/newroot\necho &quot;done&quot;\nmkdir -p \/newroot\/dev \/newroot\/proc \/newroot\/sys\nmount --move \/sys  \/newroot\/sys\nmount --move \/proc \/newroot\/proc\nmount --move \/dev  \/newroot\/dev\nexec switch_root \/newroot \/sbin\/init\n\n# \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c rootfs \u0438 initramfs:\n\ncd \/tftpboot\/toolkit\/CustomTK\/rootfs\ntar cJf \/tftpboot\/toolkit\/CustomTK\/initramfs\/rootfs.tar.xz --exclude .\/proc --exclude .\/sys --exclude .\/dev .\ncd \/tftpboot\/toolkit\/CustomTK\/initramfs\nfind . -print0 | cpio --null -ov --format=newc | gzip -9 &gt; \/tftpboot\/toolkit\/tkcustom-initramfs-new.gz<\/code><\/pre>\n<p>\nDus we hebben de kernel en initramfs opgegeven die geladen moeten worden. Als resultaat krijgen we, op dit stadium, bij het opstarten van de tussenliggende linux afbeelding via PXE, de OS-console.<\/p>\n<p>Geweldig, maar nu moeten we de controle overdragen aan onze 'automatisering'.<\/p>\n<p>Dit kan op de volgende manier.<\/p>\n<p>Stel dat we na het opstarten van de afbeelding de controle willen overdragen aan het script mount.sh.<br \/>\nWe voegen het script mount.sh toe aan de autostart. Hiervoor moeten we initramfs aanpassen:<\/p>\n<ul>\n<li>uitpakken van initramfs (als we de bovenstaande variant van initramfs gebruiken, is dit niet nodig)<\/li>\n<li>de code die de doorgegeven parameters via \/proc\/cmdline analyseert, toevoegen aan de autostart en de controle verder overdragen;<\/li>\n<li>initramfs opnieuw verpakken.<\/li>\n<\/ul>\n<p>\nOpmerking. In het geval van de X5 toolkit wordt de opstartcontrole overgedragen aan het script <code>\/opt\/x5\/toolkit\/bin\/hook.sh \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e override.conf \u0432 getty tty1 (ExecStart=\u2026) <\/code><\/p>\n<p>Dus de afbeelding wordt geladen, waarin het script mount.sh automatisch wordt gestart. Vervolgens analyseert het script mount.sh tijdens de uitvoering de doorgegeven parameters (script_cmd=) en start het het benodigde programma\/script.<\/p>\n<p>label toolkit-<b>auto<\/b><br \/>\nkernel \u2026<br \/>\nappend \u2026 nfs_toolkit_script=scripts\/mount.sh <b>script_cmd=master-install.sh<br \/>\n<\/b><br \/>\nlabel toolkit-<b>shell<\/b><br \/>\nkernel \u2026<br \/>\nappend \u2026 nfs_toolkit_script=scripts\/mount.sh <b>script_cmd=\/bin\/bash<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning zelf doen, of Automatische serverconfiguratie vanaf nul\" src=\"\/wp-content\/uploads\/2020\/03\/943eeb64fbf746feab5119ead5b1ca66.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nHier links is het PXE-menu, rechts het schema van de controle-overdracht.<\/p>\n<p>We hebben de controle-overdracht begrepen. Afhankelijk van de keuze in het PXE-menu wordt ofwel het auto-configuratiescript ofwel de debugconsole gestart.<\/p>\n<p>Bij automatische configuratie worden de benodigde mappen van de install-server gemonteerd, waarin aanwezig zijn:<\/p>\n<ul>\n<li>scripts;<\/li>\n<li>opgeslagen BIOS\/UEFI sjablonen van verschillende servers;<\/li>\n<li>firmware;<\/li>\n<li>hulpmiddelen voor servers;<\/li>\n<li>logs.<\/li>\n<\/ul>\n<p>\nVervolgens geeft het script mount.sh de controle door aan het script master-install.sh uit de scriptdirectory.<\/p>\n<p>De boom van scripts (de volgorde van hun uitvoering) ziet er ongeveer als volgt uit:<\/p>\n<ul>\n<li>master-install<\/li>\n<li>sharefunctions (gemeenschappelijke functies)<\/li>\n<li>info (weergave van informatie)<\/li>\n<li>models (instelling van installatieparameters op basis van het servermodel)<\/li>\n<li>prepare_utils (installatie van benodigde hulpprogramma's)<\/li>\n<li>fwupdate (firmware update)<\/li>\n<li>diag (elementary diagnostics)<\/li>\n<li>biosconf (BIOS\/UEFI configuration)<\/li>\n<li>clockfix (time adjustment on the motherboard)<\/li>\n<li>srmconf (configuration of remote interface)<\/li>\n<li>raidconf (configuration of logical volumes)<\/li>\n<\/ul>\n<p>\none of:<\/p>\n<ul>\n<li>preinstall (handing control to the OS or hypervisor installer, e.g., ESXi)<\/li>\n<li>merged-install (immediate start of image unpacking)<\/li>\n<\/ul>\n<p>\n<b>Now we know:<\/p>\n<ul>\n<li>how to boot the server via PXE;<\/li>\n<li>how to hand control to our own script.<\/li>\n<\/ul>\n<p><\/b><br \/>\nLet's continue. The following questions have become relevant:<\/p>\n<ul>\n<li>How to identify the server we are preparing?<\/li>\n<li>What utilities and how to configure the server?<\/li>\n<li>How to obtain settings for a specific server?<\/li>\n<\/ul>\n<p><\/p>\n<h3>How to identify the server we are preparing?<\/h3>\n<p>\nIt's simple \u2013 DMI:<\/p>\n<pre><code class=\"plaintext\">dmidecode \u2013s system-product-name\ndmidecode \u2013s system-manufacturer\ndmidecode \u2013s system-serial-number<\/code><\/pre>\n<p>\nHere you have everything you need: vendor, model, serial number. If you're not sure that this information is available on all servers, you can identify them by MAC address. Or use both methods simultaneously if the server vendors differ and some models lack serial number information.<\/p>\n<p>Based on the obtained information, network folders from the install server are mounted, and all necessary tools, firmware, and more are loaded.<\/p>\n<h3>What utilities and how to configure the server?<\/h3>\n<p>\nI will provide utilities for Linux for some manufacturers. All utilities are available on the vendors' official websites.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning zelf doen, of Automatische serverconfiguratie vanaf nul\" src=\"\/wp-content\/uploads\/2020\/03\/fab53d1fa6e9a222ec69248439551ad7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRegarding firmware, I think everything is clear. They are usually provided as packaged executable files. The executable file controls the firmware update process and reports the return code.<\/p>\n<p>BIOS and IPMI are usually configured via templates. If necessary, the template can be edited just before boot.<\/p>\n<p>RAID utilities for some vendors can also configure via templates. If not, a configuration script will need to be written.<\/p>\n<p>The typical order of RAID configuration is as follows:<\/p>\n<ul>\n<li>Request the current configuration.<\/li>\n<li>If logical arrays already exist \u2013 delete them.<\/li>\n<li>Check which physical disks are present and how many there are.<\/li>\n<li>Create a new logical array. Interrupt the process in case of an error.<\/li>\n<\/ul>\n<p><\/p>\n<h3>How to obtain settings for a specific server?<\/h3>\n<p>\nAssuming all server settings will be stored on the install server. In that case, to answer our question, we need to first determine: how to transmit settings to the install server.<\/p>\n<p>In het begin kan men prima uit de voeten met tekstbestanden. (In de toekomst kan een tekstbestand worden gebruikt als een reserve manier om instellingen over te dragen). <\/p>\n<p>Men kan het tekstbestand op de installatieserver \"delen\" en de montage ervan aan het script mount.sh toevoegen.<\/p>\n<p>De regels zullen bijvoorbeeld als volgt zijn:<\/p>\n<p><\/p>\n<p>Deze regels worden door een engineer vanaf zijn werkcomputer naar een bestand overgedragen. En vervolgens worden tijdens de serverconfiguratie de parameters voor de specifieke server uit het bestand gelezen.<\/p>\n<p>Maar op lange termijn is het beter om een database te gebruiken voor de opslag van instellingen, toestanden en installatielogs van servers.<\/p>\n<p>Natuurlijk kan men niet zonder een database, en het zal nodig zijn om een clientgedeelte te cre\u00ebren waarmee de instellingen naar de database worden overgebracht. Dit is moeilijker te realiseren dan met een tekstbestand, maar in werkelijkheid is het niet zo moeilijk als het lijkt. Een minimale versie van de client, die simpelweg gegevens naar de database zal overdragen, kan je zelf maken. En later kan de clientprogramma verder verbeterd worden in een vrije modus (rapporten, etiketten afdrukken, meldingen verzenden en andere zaken die in je opkomen).<\/p>\n<p>Door een specifieke query naar de database te doen en het serienummer van de server op te geven, krijgen we de benodigde instellingen voor de serverconfiguratie.<\/p>\n<p>Bovendien hoeven we geen blokkeringen te verzinnen voor gelijktijdige toegang, zoals in het geval van een tekstbestand.<\/p>\n<p>We kunnen de configuratielog op alle stadia in de database schrijven en het installatieproces controleren via gebeurtenissen en vlaggen van de voorbereidingstappen.<\/p>\n<p><b>Nu weten we hoe:<\/p>\n<ul>\n<li>de server op te starten via PXE;<\/li>\n<li>de controle over te dragen aan ons script;<\/li>\n<li>de server te identificeren die moet worden voorbereid, op basis van het serienummer;<\/li>\n<li>de server te configureren met de juiste tools;<\/li>\n<li>de instellingen naar de database van de installatieserver te sturen met behulp van het clientgedeelte.<\/li>\n<\/ul>\n<p>\nWe hebben vastgesteld hoe:<\/p>\n<ul>\n<li>de te installeren server de benodigde instellingen uit de database ontvangt;<\/li>\n<li>de voortgang van de voorbereiding in de database wordt vastgelegd (logs, gebeurtenissen, voorbereidingstappen).<\/li>\n<\/ul>\n<p><\/b><\/p>\n<h3>Wat betreft verschillende soorten te installeren software? Hoe installeer je een hypervisor, kopieer je een VM en configureer je dit alles?<\/h3>\n<p>\nBij het uitrollen van een bestandssysteem-image (linux) op hardware is het vrij eenvoudig:<\/p>\n<ul>\n<li>Na het instellen van alle servercomponenten, rollen we de image uit.<\/li>\n<li>We installeren de bootloader grub.<\/li>\n<li>We maken chroot en stellen alles in wat nodig is.<\/li>\n<\/ul>\n<p>\n<b>Hoe de controle over te dragen aan de OS-installateur (met ESXi als voorbeeld).<\/b><\/p>\n<ul>\n<li>We organiseren de overdracht van de controle van ons script naar de hypervisor-installateur via het antwoordbestand (kickstart):<\/li>\n<li>We verwijderen de huidige partities op de schijf.<\/li>\n<li>We maken een partitie van 500MB.<\/li>\n<li>We markeren deze als opstartbaar.<\/li>\n<li>We formatteren in FAT32.<\/li>\n<li>We kopi\u00ebren de installatiebestanden van ESXi naar de root.<\/li>\n<li>We installeren syslinux.<\/li>\n<li>We kopi\u00ebren syslinux.cfg naar \/syslinux\/<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">default esxi\nprompt 1\ntimeout 50\nlabel esxi\nkernel mboot.c32\nappend -c boot.cfg<\/code><\/pre>\n<p><\/p>\n<ul>\n<li>We kopi\u00ebren mboot.c32 naar \/syslinux.<\/li>\n<li>In boot.cfg moet kernelopt=ks=ftp:\/\/\/ks_esxi.cfg staan.<\/li>\n<li>Herstart de server.<\/li>\n<\/ul>\n<p>\nNa het opnieuw opstarten van de server vanaf de harde schijf, zal de ESXi-installateur opstarten. Alle noodzakelijke installatiebestanden worden in het geheugen geladen en vervolgens begint de installatie van ESXi, volgens het opgegeven antwoordbestand.<\/p>\n<p>Hier geef ik een paar regels uit het antwoordbestand ks_esxi.cfg:<\/p>\n<pre><code class=\"plaintext\">%firstboot --interpreter=busybox\n\u2026\n# verkregen serienummer\n\nSYSSN=$(esxcli hardware platform get | grep Serial | awk -F \" \" '{print $3}')\n\n# verkregen IP\n\nIPADDRT=$(esxcli network ip interface ipv4 get | grep vmk0 | awk -F \" \" '{print $2}')\nLAST_OCTET=$(echo $IPADDRT | awk -F'.' '{print $4}')\n\n# verbind NFS-installatieserver\n\nesxcli storage nfs add -H is -s \/srv\/nfs_share -v nfsshare1\n\n# kopieer tijdelijke SSH-instellingen voor gebruik met SSH-client\n\nmv \/etc\/ssh \/etc\/ssh.tmp\ncp -R \/vmfs\/volumes\/nfsshare1\/ssh \/etc\/\nchmod go-r \/etc\/ssh\/ssh_host_rsa_key\n\n# kopieer ovftool voor VM-implementatie nu, plus mogelijk later nuttig\n\ncp -R \/vmfs\/volumes\/nfsshare1\/ovftool \/vmfs\/volumes\/datastore1\/\n\n# implementeer VM\n\n\/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\n\/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\n\n# verkregen regel met instellingen van onze server\n\nssh 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' &gt; \/tmp\/servers\n...\n# genereer netwerkconfiguratiescript\n\necho '#!\/bin\/sh' &gt; \/vmfs\/volumes\/datastore1\/netconf.sh\necho \"esxcli network ip interface ipv4 set -i=vmk0 -t=static --ipv4=$IPADDR --netmask=$S_SUB || exit 1\" &gt;&gt; \/vmfs\/volumes\/datastore1\/netconf.sh\necho \"esxcli network ip route ipv4 add -g=$S_GW -n=default || exit 1\" &gt;&gt; \/vmfs\/volumes\/datastore1\/netconf.sh\nchmod a+x \/vmfs\/volumes\/datastore1\/netconf.sh\n\n# stel parameter guestinfo.esxihost.id in, geef serienummer op\n\necho \"guestinfo.esxihost.id = \"$SYSSN\"\" &gt;&gt; \/vmfs\/volumes\/datastore1\/VM1\/VM1.vmx\necho \"guestinfo.esxihost.id = \"$SYSSN\"\" &gt;&gt; \/vmfs\/volumes\/datastore1\/VM2\/VM2.vmx\n...\n# werk informatie in de database bij\n\nSYSNAME=$(esxcli hardware platform get | grep Product | sed 's\/Product Name:\/\/;s\/^ *\/\/')\nUUID=$(vim-cmd hostsvc\/hostsummary | grep uuid | sed 's\/ \/\/g;s\/,$\/\/;s\/^uuid=\"\/\/;s\/\"$\/\/')\nssh root@is \"mysql -D'servers' -u'user' -p'secretpassword' -e \"UPDATE servers ... SET ... WHERE servers.serial='$SYSSN'\"\"\nssh root@is \"mysql -D'servers' -u'user' -p'secretpassword' -e \"INSERT INTO events ...\"\"\n\n# herstel SSH-instellingen\n\nrm -rf \/etc\/ssh\nmv \/etc\/ssh.tmp \/etc\/ssh\n\n# configureer netwerk en herstart\n\nesxcli system hostname set --fqdn=esx-${G_NICK}.x5.ru\n\/vmfs\/volumes\/datastore1\/netconf.sh\nreboot\n<\/code><\/pre>\n<p>\nOp dit punt is de hypervisor ge\u00efnstalleerd en geconfigureerd en zijn de virtuele machines gekopieerd.<\/p>\n<p>Hoe configureer je nu de virtuele machines?<\/p>\n<p>We hebben een beetje vals gespeeld: tijdens de installatie hebben we de parameter guestinfo.esxihost.id = \"$SYSSN\" ingesteld in het bestand VM1.vmx, waarbij we het serienummer van de fysieke server hebben opgegeven.<\/p>\n<p>Nu kan de virtuele machine (met het ge\u00efnstalleerde vmware-tools pakket) na opstarten toegang krijgen tot deze parameter:<\/p>\n<pre><code class=\"plaintext\">ESXI_SN=$(vmtoolsd --cmd \"info-get guestinfo.esxihost.id\")<\/code><\/pre>\n<p>\nDat wil zeggen dat de VM zichzelf kan identificeren (ze kent het serienummer van de fysieke host), een aanvraag kan doen bij de installatieserver database en de parameters kan ontvangen die geconfigureerd moeten worden. Dit alles wordt vastgelegd in een script dat automatisch moet worden uitgevoerd bij de opstart van de guestos vm (maar slechts \u00e9\u00e9n keer: RunOnce).<\/p>\n<p><b>Nu weten we hoe:<\/p>\n<ul>\n<li>de server op te starten via PXE;<\/li>\n<li>de controle over te dragen aan ons script;<\/li>\n<li>de server te identificeren die moet worden voorbereid, op basis van het serienummer;<\/li>\n<li>de server configureren met de bijbehorende hulpmiddelen;<\/li>\n<li>instellingen doorgeven aan de installatieserver database via de clientzijde;<\/li>\n<li>verschillende soorten software configureren, waaronder het implementeren van de hypervisor esxi en het instellen van virtuele machines (en dat alles automatisch).<\/li>\n<\/ul>\n<p>\nWe hebben vastgesteld hoe:<\/p>\n<ul>\n<li>de te installeren server de benodigde instellingen uit de database ontvangt;<\/li>\n<li>de voortgang van de voorbereiding in de database wordt vastgelegd (logs, gebeurtenissen, voorbereidingstappen).<\/li>\n<\/ul>\n<p><\/b><br \/>\n<u><b>Conclusie:<\/b><\/u><\/p>\n<p>Ik denk dat de uniciteit van deze oplossing ligt in de flexibiliteit, eenvoud, mogelijkheden en veelzijdigheid.<\/p>\n<p>Laat alstublieft weten wat je ervan vindt in de opmerkingen.<br \/>\n<br \/>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/X5RetailGroup\/blog\/493124\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u044f \u0414\u0435\u043d\u0438\u0441 \u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2013 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 X5. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0445\u043e\u0442\u0435\u043b \u0431\u044b \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0431\u0430\u0437\u0435 \u043e\u0431\u0449\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u044d\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435, \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0438 \u0433\u0438\u0431\u043a\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435. \u041f\u043e\u0434 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u043e\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f: \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74906,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74905","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u044f \u0414\u0435\u043d\u0438\u0441 \u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2013 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 X5.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Bare-Metal Provisioning \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0438\u043b\u0438 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441 \u043d\u0443\u043b\u044f | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442, \u044f \u0414\u0435\u043d\u0438\u0441 \u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2013 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 X5.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-03-21T17:42:25+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-21T17:42:25+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Bare-Metal Provisioning zelf doen, of Automatische servervoorbereiding vanaf nul | ProHoster","description":"Hallo, ik ben Denis en een van mijn specialisaties is de ontwikkeling van infrastructuuroplossingen bij X5.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Bare-Metal Provisioning \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438, \u0438\u043b\u0438 \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441 \u043d\u0443\u043b\u044f | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442, \u044f \u0414\u0435\u043d\u0438\u0441 \u0438 \u043e\u0434\u043d\u043e \u0438\u0437 \u043c\u043e\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439 \u0434\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u2013 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 X5.","og:url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-03-21T17:42:25+00:00","article:modified_time":"2020-03-21T17:42:25+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74905","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 18:05:46","updated":"2026-02-09 16:50:18","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=74905"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74905\/revisions"}],"predecessor-version":[{"id":158713,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/74905\/revisions\/158713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/74906"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=74905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=74905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=74905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}