{"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\/it\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya","title":{"rendered":"Bare-Metal Provisioning fai da te, o Preparazione automatica dei server da zero","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ciao, sono Denis e uno dei miei ambiti di attivit\u00e0 \u00e8 lo sviluppo di soluzioni infrastrutturali in X5. Oggi vorrei condividere con voi come sia possibile creare un sistema automatico di preparazione dei server utilizzando strumenti accessibili a tutti. A mio avviso, \u00e8 una soluzione interessante, semplice e flessibile.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning fai da te, o Preparazione automatica dei server da zero\" 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 \/>\nPer preparazione si intende: creare un server nuovo di fabbrica, un server completamente configurato con sistema operativo Linux o con hypervisor ESXi (il dispiegamento <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/it\/server\/\"   title=\"server\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"1469\">server<\/a> di Windows non \u00e8 trattato in questo articolo).<\/p>\n<p><b>Termini<\/b>:<\/p>\n<ul>\n<li>server \u2013 server che devono essere configurati.<\/li>\n<li>install-server \u2013 server principale che gestisce l'intero processo di preparazione attraverso la rete.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Perch\u00e9 \u00e8 necessaria l'automazione?<\/h3>\n<p>\nSupponiamo di avere la necessit\u00e0 di preparare server in massa a partire da zero, al massimo \u2013 30 al giorno. Server di diversi produttori e modelli, su cui possono essere installati diversi sistemi operativi, pu\u00f2 esserci o non esserci un hypervisor.<\/p>\n<p>Quali operazioni sono incluse nel processo di configurazione (senza automazione):<\/p>\n<ul>\n<li>collegare tastiera, mouse, monitor al server;<\/li>\n<li>configurare BIOS, RAID, IPMI;<\/li>\n<li>aggiornare il firmware dei componenti;<\/li>\n<li>distribuire un'immagine del filesystem (oppure installare un hypervisor e copiare le macchine virtuali);<\/li>\n<\/ul>\n<p>\nNota. Come opzione, il dispiegamento del sistema operativo \u00e8 possibile tramite installazione con un file di risposte automatiche. Ma questo non sar\u00e0 discusso nell'articolo. Anche se pi\u00f9 avanti vedrete che aggiungere questa funzionalit\u00e0 non \u00e8 complicato.<\/p>\n<ul>\n<li>configurare i parametri del sistema operativo (hostname, IP, ecc.).<\/li>\n<\/ul>\n<p>\nCon questo approccio, le stesse configurazioni vengono eseguite in sequenza su ogni server. L'efficacia di questo lavoro \u00e8 molto bassa.<\/p>\n<p>L'essenza dell'automazione \u00e8 quella di escludere la partecipazione umana dal processo di preparazione del server. Il massimo, per quanto possibile. <\/p>\n<p>Grazie all'automazione, si riduce il tempo di inattivit\u00e0 tra le operazioni e si ha la possibilit\u00e0 di preparare pi\u00f9 server contemporaneamente. Inoltre, si riduce notevolmente la probabilit\u00e0 di errori dovuti al fattore umano.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning fai da te, o Preparazione automatica dei server da zero\" src=\"\/wp-content\/uploads\/2020\/03\/8c196058891a7f41c5b93e7f6721480b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Come avviene la configurazione automatica dei server?<\/h3>\n<p>\nAnalizziamo ogni fase in dettaglio.<\/p>\n<p>Hai un server Linux che utilizzi come PXE install-server. Su di esso sono installati e configurati i servizi: DHCP, TFTP.<\/p>\n<p>Quindi, carichiamo il server (quello che deve essere configurato) tramite PXE. Ricordiamo come funziona:<\/p>\n<ul>\n<li>Sul server \u00e8 selezionato il caricamento dalla rete.<\/li>\n<li>Il server carica il PXE-ROM della scheda di rete e si rivolge al server di installazione tramite DHCP per ottenere un indirizzo di rete.<\/li>\n<li>Il server di installazione DHCP assegna un indirizzo e fornisce anche istruzioni per il caricamento successivo tramite PXE.<\/li>\n<li>Il server carica il bootloader di rete dal server di installazione tramite PXE, il caricamento successivo avviene secondo il file di configurazione PXE.<\/li>\n<li>Il caricamento avviene sulla base dei parametri ricevuti (kernel, initramfs, punti di montaggio, immagine squashfs e altro).<\/li>\n<\/ul>\n<p>\nNota. Nell'articolo viene fornita una descrizione del caricamento tramite PXE in modalit\u00e0 BIOS. Attualmente i produttori stanno implementando attivamente la modalit\u00e0 di avvio UEFI. Per PXE, la differenza sar\u00e0 nella configurazione del server DHCP e nella presenza di un bootloader aggiuntivo.<\/p>\n<p>Consideriamo un esempio della configurazione del server PXE (menu pxelinux).<\/p>\n<p>File 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 \/\/ menu predefinito\n\tMENU LABEL Linux Scripting Toolkits\n\tMENU default\n\tKERNEL menu.c32\n\tAPPEND pxelinux.cfg\/toolkit \/\/ passaggio al menu successivo<\/code><\/pre>\n<p>\nFile pxelinux.cfg\/toolkit:<\/p>\n<pre><code class=\"plaintext\">prompt 0\ntimeout 100\nmenu title X5 PXE Boot Menu\nlabel mainmenu\n    menu label ^Torna al menu principale\n    kernel menu.c32\n    append pxelinux.cfg\/default\nlabel x5toolkit-auto \/\/ predefinito \u2014 modalit\u00e0 automatica\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 \/\/ per debug - 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>\nIl kernel e l'initramfs a questo punto sono un'immagine linux intermedia, grazie alla quale avverr\u00e0 la preparazione e configurazione principale del server.<\/p>\n<p>Come potete vedere, il bootloader passa molti parametri al kernel. Parte di questi parametri sono utilizzati dal kernel stesso. Alcuni possiamo utilizzarli per i nostri scopi. Questo verr\u00e0 spiegato ulteriormente, ma per ora si pu\u00f2 semplicemente ricordare che tutti i parametri passati saranno disponibili nell'immagine linux intermedia attraverso \/proc\/cmdline.<\/p>\n<p>Da dove prendere il kernel e l'initramfs?<br \/>\nCome base, si pu\u00f2 scegliere qualsiasi distribuzione linux. A cosa prestare attenzione nella scelta:<\/p>\n<ul>\n<li>l'immagine di avvio deve essere universale (disponibilit\u00e0 di driver, possibilit\u00e0 di installare utilit\u00e0 aggiuntive);<\/li>\n<li>probabilmente sar\u00e0 necessario personalizzare initramfs.<\/li>\n<\/ul>\n<p>\nCome \u00e8 fatto nella nostra soluzione per X5? \u00c8 stata scelta come base CentOS 7. Faremo il seguente trucco: prepareremo la futura struttura dell'immagine, la impacchetteremo in un archivio e creeremo initramfs, all'interno del quale ci sar\u00e0 il nostro archivio del filesystem. All'avvio dell'immagine, l'archivio verr\u00e0 estratto nella partizione tmpfs creata. In questo modo otterremo un'immagine live di linux minimale, ma completa, con tutte le utilit\u00e0 necessarie, composta da soli due file: vmkernel e 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>\nQuindi, abbiamo specificato il kernel e initramfs che devono essere caricati. Di conseguenza, in questa fase, avviando l'immagine intermedia linux tramite PXE, otterremo la console del SO.<\/p>\n<p>Ottimo, ma ora dobbiamo trasferire il controllo alla nostra 'automazione'.<\/p>\n<p>Questo pu\u00f2 essere fatto in questo modo.<\/p>\n<p>Supponiamo che, dopo il caricamento dell'immagine, intendiamo trasferire il controllo allo script mount.sh.<br \/>\nInseriremo lo script mount.sh nel caricamento automatico. Per questo sar\u00e0 necessario modificare initramfs:<\/p>\n<ul>\n<li>estrarre initramfs (se utilizziamo la variante initramfs sopra menzionata, questo non \u00e8 necessario)<\/li>\n<li>includere nel caricamento automatico il codice che analizzer\u00e0 i parametri trasmessi tramite \/proc\/cmdline e passer\u00e0 il controllo successivo;<\/li>\n<li>impacchettare initramfs.<\/li>\n<\/ul>\n<p>\nNota. Nel caso di X5 toolkit, il controllo del caricamento viene trasferito allo 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>Quindi, viene caricata un'immagine in cui allo startup automatico viene avviato lo script mount.sh. Successivamente, lo script mount.sh analizza durante l'esecuzione i parametri trasmessi (script_cmd=) e avvia il programma\/script necessario.<\/p>\n<p>etichetta toolkit-<b>auto<\/b><br \/>\nkernel \u2026<br \/>\naggiungi \u2026 nfs_toolkit_script=scripts\/mount.sh <b>script_cmd=master-install.sh<br \/>\n<\/b><br \/>\netichetta toolkit-<b>shell<\/b><br \/>\nkernel \u2026<br \/>\naggiungi \u2026 nfs_toolkit_script=scripts\/mount.sh <b>script_cmd=\/bin\/bash<\/b><\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning fai da te, o Preparazione automatica dei server da zero\" src=\"\/wp-content\/uploads\/2020\/03\/943eeb64fbf746feab5119ead5b1ca66.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQui a sinistra c'\u00e8 il menu PXE, a destra \u2013 lo schema di trasferimento del controllo.<\/p>\n<p>Abbiamo chiarito il trasferimento del controllo. A seconda della scelta nel menu PXE, viene avviato o lo script di auto-configurazione o la console di debug.<\/p>\n<p>Nel caso di configurazione automatica, vengono montate le directory necessarie dal server di installazione, che contengono:<\/p>\n<ul>\n<li>script;<\/li>\n<li>modelli BIOS\/UEFI salvati di vari server;<\/li>\n<li>firmware;<\/li>\n<li>utilit\u00e0 per server;<\/li>\n<li>log.<\/li>\n<\/ul>\n<p>\nSuccessivamente, lo script mount.sh trasferisce il controllo allo script master-install.sh dalla directory degli script.<\/p>\n<p>L'albero degli script (l'ordine della loro esecuzione) appare pi\u00f9 o meno cos\u00ec:<\/p>\n<ul>\n<li>master-install<\/li>\n<li>sharefunctions (funzioni comuni)<\/li>\n<li>info (output delle informazioni)<\/li>\n<li>modelli (installazione dei parametri di installazione in base al modello del server)<\/li>\n<li>prepare_utils (installazione delle utilit\u00e0 necessarie)<\/li>\n<li>fwupdate (aggiornamento del firmware)<\/li>\n<li>diag (diagnostica elementare)<\/li>\n<li>biosconf (configurazione del BIOS\/UEFI)<\/li>\n<li>clockfix (impostazione dell'ora sulla scheda madre)<\/li>\n<li>srmconf (configurazione dell'interfaccia remota)<\/li>\n<li>raidconf (configurazione dei volumi logici)<\/li>\n<\/ul>\n<p>\nuno dei seguenti:<\/p>\n<ul>\n<li>preinstall (passaggio di controllo all'installatore del sistema operativo o del hypervisor, ad esempio ESXi)<\/li>\n<li>merged-install (avvio diretto dell'estrazione dell'immagine)<\/li>\n<\/ul>\n<p>\n<b>Ora sappiamo:<\/p>\n<ul>\n<li>come avviare il server tramite PXE;<\/li>\n<li>come passare il controllo a uno script personalizzato.<\/li>\n<\/ul>\n<p><\/b><br \/>\nContinuiamo. Le seguenti domande sono ora pertinenti:<\/p>\n<ul>\n<li>Come identificare il server che stiamo preparando?<\/li>\n<li>Quali utilit\u00e0 e come configurare il server?<\/li>\n<li>Come ottenere le impostazioni per un server specifico?<\/li>\n<\/ul>\n<p><\/p>\n<h3>Come identificare il server che stiamo preparando?<\/h3>\n<p>\n\u00c8 semplice \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>\nQui ci sono tutte le informazioni necessarie: venditore, modello, numero di serie. Se non sei sicuro che queste informazioni siano disponibili su tutti i server, puoi identificarli tramite l'indirizzo MAC. Oppure in entrambi i modi contemporaneamente, se i venditori dei server sono diversi e su alcuni modelli le informazioni sul numero di serie sono semplicemente assenti.<\/p>\n<p>Sulla base delle informazioni ricevute, vengono montate le cartelle di rete dal server di installazione e vengono caricati tutti i necessari (utilit\u00e0, firmware e altro).<\/p>\n<h3>Quali utilit\u00e0 e come configurare il server?<\/h3>\n<p>\nForner\u00f2 le utilit\u00e0 per linux di alcuni produttori. Tutte le utilit\u00e0 sono disponibili sui siti ufficiali dei venditori.<\/p>\n<p><img decoding=\"async\" alt=\"Bare-Metal Provisioning fai da te, o Preparazione automatica dei server da zero\" src=\"\/wp-content\/uploads\/2020\/03\/fab53d1fa6e9a222ec69248439551ad7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer quanto riguarda i firmware, penso che sia tutto chiaro. Di solito vengono forniti in forma di file eseguibili compressi. Il file eseguibile controlla il processo di aggiornamento del firmware e restituisce un codice di uscita.<\/p>\n<p>Il BIOS e l'IPMI di solito vengono configurati tramite modelli. Se necessario, il modello pu\u00f2 essere modificato prima del caricamento.<\/p>\n<p>Le utilit\u00e0 RAID di alcuni venditori possono anche configurare tramite un modello. Se non \u00e8 cos\u00ec, sar\u00e0 necessario scrivere uno script di configurazione.<\/p>\n<p>L'ordine di configurazione del RAID \u00e8 solitamente il seguente:<\/p>\n<ul>\n<li>Richiediamo la configurazione attuale.<\/li>\n<li>Se ci sono gi\u00e0 array logici \u2013 li cancelliamo.<\/li>\n<li>Controlliamo quali dischi fisici sono presenti e quanti sono.<\/li>\n<li>Creiamo un nuovo array logico. Interrompiamo il processo in caso di errore.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Come ottenere le impostazioni per un server specifico?<\/h3>\n<p>\nSupponiamo che le impostazioni di tutti i server siano archiviate sul server di installazione. In tal caso, per rispondere alla nostra domanda, dobbiamo prima decidere: come trasferire le impostazioni al server di installazione.<\/p>\n<p>Inizialmente, si pu\u00f2 tranquillamente fare a meno di file di testo. (In futuro si pu\u00f2 utilizzare un file di testo come metodo di backup per il trasferimento delle impostazioni). <\/p>\n<p>Si pu\u00f2 'condividere' un file di testo sul server di installazione. E aggiungere il suo montaggio nello script mount.sh.<\/p>\n<p>Le righe saranno, ad esempio, di questo tipo:<\/p>\n<p><\/p>\n<p>Queste righe saranno trasmesse in un file dall'ingegnere dalla sua macchina di lavoro. E successivamente, durante la configurazione del server, i parametri per il server specifico saranno letti dal file.<\/p>\n<p>Ma, a lungo termine, \u00e8 meglio utilizzare un database per memorizzare le impostazioni, gli stati e i log delle installazioni dei server.<\/p>\n<p>Certo, non \u00e8 sufficiente un solo database, e sar\u00e0 necessario creare una parte client, tramite la quale le impostazioni saranno trasmesse al database. Realizzarlo \u00e8 pi\u00f9 complicato rispetto a un file di testo, ma in realt\u00e0 non \u00e8 cos\u00ec difficile come sembra. \u00c8 assolutamente possibile scrivere da soli una versione minima del client, che trasmetter\u00e0 semplicemente i dati al database. E in seguito, si potr\u00e0 migliorare il programma client in modalit\u00e0 libera (report, stampa etichette, invio di notifiche e qualsiasi altra cosa che venga in mente).<\/p>\n<p>Facendo una certa richiesta al database e specificando il numero di serie del server, otterremo i parametri necessari per la configurazione del server.<\/p>\n<p>Inoltre, non sar\u00e0 necessario pensare a blocchi per l'accesso simultaneo, come nel caso di un file di testo.<\/p>\n<p>Possiamo scrivere il registro delle configurazioni nel database in ogni fase e controllare il processo di installazione tramite eventi e flag delle fasi di preparazione.<\/p>\n<p><b>Ora sappiamo come:<\/p>\n<ul>\n<li>avviare il server tramite PXE;<\/li>\n<li>passare il controllo al nostro script;<\/li>\n<li>identificare il server da preparare in base al numero di serie;<\/li>\n<li>configurare il server con gli strumenti appropriati;<\/li>\n<li>trasmettere le impostazioni al database del server di installazione tramite la parte client.<\/li>\n<\/ul>\n<p>\nAbbiamo scoperto come:<\/p>\n<ul>\n<li>il server da installare riceve le impostazioni necessarie dal database;<\/li>\n<li>tutti i progressi della preparazione vengono registrati nel database (log, eventi, flag delle fasi).<\/li>\n<\/ul>\n<p><\/b><\/p>\n<h3>E per quanto riguarda i vari tipi di software da installare? Come installare un hypervisor, copiare una VM e configurare tutto questo?<\/h3>\n<p>\nNel caso di distribuzione di un'immagine di filesystem (linux) sull'hardware, \u00e8 tutto piuttosto semplice:<\/p>\n<ul>\n<li>Dopo aver configurato tutti i componenti del server, distribuiamo l'immagine.<\/li>\n<li>Installiamo il bootloader grub.<\/li>\n<li>Eseguiamo chroot e configuriamo tutto ci\u00f2 che serve.<\/li>\n<\/ul>\n<p>\n<b>Come passare il controllo all'installatore del sistema operativo (con ESXi come esempio).<\/b><\/p>\n<ul>\n<li>Organizziamo il passaggio di controllo dal nostro script all'installatore del hypervisor tramite un file di risposte automatiche (kickstart):<\/li>\n<li>Rimuoviamo le partizioni attuali sul disco.<\/li>\n<li>Creiamo una partizione di 500MB.<\/li>\n<li>La segnaliamo come avviabile.<\/li>\n<li>Formattiamo in FAT32.<\/li>\n<li>Copiamo i file di installazione di ESXi nella radice.<\/li>\n<li>Installiamo syslinux.<\/li>\n<li>Copiamo syslinux.cfg in \/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>Copiamo mboot.c32 in \/syslinux.<\/li>\n<li>In boot.cfg deve essere kernelopt=ks=ftp:\/\/\/ks_esxi.cfg<\/li>\n<li>Riavviamo il server.<\/li>\n<\/ul>\n<p>\nDopo il riavvio del server, l'installatore di ESXi si avvier\u00e0 dal disco rigido. Tutti i file necessari dell'installatore verranno caricati in memoria e quindi inizier\u00e0 l'installazione di ESXi, secondo il file di risposte automatiche indicato.<\/p>\n<p>Qui riporter\u00f2 alcune righe dal file di risposte automatiche ks_esxi.cfg:<\/p>\n<pre><code class=\"plaintext\">%firstboot --interpreter=busybox\n\u2026\n# otteniamo il numero di serie\n\nSYSSN=$(esxcli hardware platform get | grep Serial | awk -F \" \" '{print $3}')\n\n# otteniamo l'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# connettiamo il server di installazione NFS\n\nesxcli storage nfs add -H is -s \/srv\/nfs_share -v nfsshare1\n\n# copiamo le impostazioni temporanee di ssh, per utilizzare il client ssh\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# copiamo ovftool, per il dispiegamento della VM ora, pi\u00f9 potrebbe servirci in seguito\n\ncp -R \/vmfs\/volumes\/nfsshare1\/ovftool \/vmfs\/volumes\/datastore1\/\n\n# dispieghiamo la 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# otteniamo la stringa con le impostazioni del nostro 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# generiamo lo script di configurazione di rete\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# impostiamo il parametro guestinfo.esxihost.id, specificando il numero di serie\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# aggiorniamo le informazioni nel database\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# ripristiniamo le impostazioni SSH\n\nrm -rf \/etc\/ssh\nmv \/etc\/ssh.tmp \/etc\/ssh\n\n# configuriamo la rete e riavviamo\n\nesxcli system hostname set --fqdn=esx-${G_NICK}.x5.ru\n\/vmfs\/volumes\/datastore1\/netconf.sh\nreboot\n<\/code><\/pre>\n<p>\nIn questa fase, l'hypervisor \u00e8 stato installato e configurato, e le macchine virtuali sono state copiati.<\/p>\n<p>Come posso ora configurare le macchine virtuali?<\/p>\n<p>Abbiamo un po' imbroglato: durante l'installazione abbiamo impostato il parametro guestinfo.esxihost.id = \"$SYSSN\" nel file VM1.vmx, specificando il numero di serie del server fisico.<\/p>\n<p>Ora, dopo l'avvio, la macchina virtuale (con il pacchetto vmware-tools installato) pu\u00f2 accedere a questo parametro:<\/p>\n<pre><code class=\"plaintext\">ESXI_SN=$(vmtoolsd --cmd \"info-get guestinfo.esxihost.id\")<\/code><\/pre>\n<p>\nCio\u00e8, la VM sar\u00e0 in grado di identificarsi (sa il numero di serie dell'host fisico), fare una richiesta al database del server di installazione e ottenere i parametri da configurare. Tutto questo viene formalizzato in uno script che deve essere eseguito automaticamente all'avvio della VM guestos (ma solo una volta: RunOnce).<\/p>\n<p><b>Ora sappiamo come:<\/p>\n<ul>\n<li>avviare il server tramite PXE;<\/li>\n<li>passare il controllo al nostro script;<\/li>\n<li>identificare il server da preparare in base al numero di serie;<\/li>\n<li>configurare il server con gli strumenti appropriati;<\/li>\n<li>trasmettere le impostazioni nel database del server di installazione tramite la parte client;<\/li>\n<li>configurare diversi tipi di software, incluso il deployment dell'hypervisor esxi e la configurazione delle macchine virtuali (e tutto automaticamente).<\/li>\n<\/ul>\n<p>\nAbbiamo scoperto come:<\/p>\n<ul>\n<li>il server da installare riceve le impostazioni necessarie dal database;<\/li>\n<li>tutti i progressi della preparazione vengono registrati nel database (log, eventi, flag delle fasi).<\/li>\n<\/ul>\n<p><\/b><br \/>\n<u><b>Risultato:<\/b><\/u><\/p>\n<p>Ritengo che l'unicit\u00e0 di questa soluzione risieda nella flessibilit\u00e0, nella semplicit\u00e0, nelle sue capacit\u00e0 e nella sua versatilit\u00e0.<\/p>\n<p>Per favore, scrivi nei commenti cosa ne pensi.<br \/>\n<br \/>Fonte: <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.1.1 - 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\/it\/blog\/administrirovanie\/bare-metal-provisioning-svoimi-rukami-ili-avtomaticheskaya-podgotovka-serverov-s-nulya\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\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\/it\/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 fai da te, o Preparazione automatica dei server da zero | ProHoster","description":"Ciao, sono Denis e una delle mie aree di attivit\u00e0 \u00e8 lo sviluppo di soluzioni infrastrutturali in X5.","canonical_url":"https:\/\/prohoster.info\/it\/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":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/74905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=74905"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/74905\/revisions"}],"predecessor-version":[{"id":158713,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/74905\/revisions\/158713"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/74906"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=74905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=74905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=74905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}