Distribuzione rapida di vm ESXi tramite Terraform

Ciao a tutti, mi chiamo Ivan e sono un amministratore di sistema alcolista (OPS).

Vorrei raccontare come implemento macchine virtuali su ESXi senza vCenter utilizzando Terraform.

Spesso devo creare/rifare macchine virtuali per testare app vari. A causa della mia pigrizia, ho pensato di automatizzare il processo. Le mie ricerche mi hanno portato a un prodotto straordinario dell'azienda hashicorp, terraform.

Penso che molti sappiano cos'è Terraform, e per chi non lo sapesse, è un'applicazione per gestire qualsiasi cloud, infrastruttura o servizio utilizzando il concetto di IasC (Infrastruttura come codice).

Come ambiente di virtualizzazione utilizzo ESXi. È piuttosto semplice, comodo e affidabile.
Prevedo la domanda.

Perché terraform se posso usare vCenter Server?

Si può, certo, ma. Primo: è una licenza aggiuntiva, secondo: questo prodotto è molto esigente in termini di risorse e non potrà semplicemente adattarsi al mio server domestico, e terzo: la possibilità di migliorare le proprie competenze.

Come server utilizzo la piattaforma Intel NUC:

CPU: 2 CPU x Intel(R) Core(TM) i3-4010U CPU @ 1.70GHz
RAM: 8Gb
HDD: 500Gb
Versione ESXi: ESXi-6.5.0-4564106-standard (VMware, Inc.)

E così, iniziamo in ordine.

Per ora, impostiamo esxi, cioè apriamo la porta VNC nelle impostazioni del firewall.

Per impostazione predefinita, il file è protetto da scrittura. Eseguiamo le seguenti operazioni:

chmod 644 /etc/vmware/firewall/service.xml
chmod +t /etc/vmware/firewall/service.xml
vi /etc/vmware/firewall/service.xml

Aggiungiamo alla fine del file il seguente blocco:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Uscendo, salviamo. Cambiamo i permessi di nuovo e riavviamo il servizio:

chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refresh

Valido fino al riavvio dell'host. Dopo, dovremo ripetere questa operazione.

Dopo farò tutto il lavoro in una macchina virtuale su questo stesso server.

Caratteristiche:

OS: Centos 7 x86_64 minimal
RAM: 1GB
HDD: 20GB
Selinux: disabilitato
firewalld: disabilitato

Dopo avremo bisogno di packer, un altro prodotto dell'azienda HashiCorp.

Serve per costruire automaticamente un'immagine 'golden'. Che utilizzeremo in futuro.

yum install unzip git -y
curl -O https://releases.hashicorp.com/packer/1.5.5/packer_1.5.5_linux_amd64.zip
unzip packer_1.5.5_linux_amd64.zip -d /usr/bin && rm -rf packer_1.5.5_linux_amd64.zip
versione packer
Packer v1.5.5

Nella fase versione packer può verificarsi un errore, poiché in RedHat-based potrebbe trovarsi un pacchetto con lo stesso nome.

which -a packer
/usr/sbin/packer

Per risolvere, è possibile creare un symlink o utilizzare il percorso assoluto /usr/bin/packer.

Ora abbiamo bisogno di ovftool link di download. Scarichiamo, mettiamo sul server e installiamo:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Estrazione dell'Installer VMware...completato.
Devi accettare il contratto di licenza per l'utente finale del VMware OVF Tool per Linux per continuare.  Premi Invio per procedere.
CONTRATTO DI LICENZA PER L'UTENTE FINALE DI VMWARE
Sei d'accordo? [yes/no]:yes
Il prodotto è pronto per essere installato.  Premi Invio per avviare l'installazione o Ctrl-C per annullare.
Installazione del componente VMware OVF Tool per Linux 4.4.0
    Configurazione...
[######################################################################] 100%
Installazione completata con successo.

Andiamo avanti.

Su Git ho preparato tutto il necessario.

git clone https://github.com/letnab/create-and-deploy-esxi.git && cd create-and-deploy-esxi

Nella cartella iso deve essere posizionato il disco di installazione del sistema operativo. Nel mio caso, si tratta di centos 7.

È inoltre necessario modificare il file centos-7-base.json:

variables: specificare i propri dati di connessione
iso_urls: specificare l'attuale
iso_checksum: checksum della tua immagine 

Dopo tutte le modifiche, avviamo la costruzione:

/usr/bin/packer build centos-7-base.json

Se tutto è configurato e specificato correttamente, vedrai il processo di installazione automatica del sistema operativo. Questo processo richiede 7-8 minuti per me.

Dopo il completamento con successo, nella cartella output-packer-centos7-x86_64 sarà presente un file ova.

Installa Terraform:

curl -O https://releases.hashicorp.com/terraform/0.12.24/terraform_0.12.24_linux_amd64.zip
unzip terraform_0.12.24_linux_amd64.zip -d /usr/bin/ && rm -rf terraform_0.12.24_linux_amd64.zip
tf version
Terraform v0.12.24

Poiché Terraform non ha un provider per ESXi, dobbiamo compilarlo.

Installa go:

cd /tmp
curl -O https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.14.2.linux-amd64.tar.gz && rm -rf go1.14.2.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version
go version go1.14.2 linux/amd64

Successivamente costruiamo il provider:

go get -u -v golang.org/x/crypto/ssh
go get -u -v github.com/hashicorp/terraform
go get -u -v github.com/josenk/terraform-provider-esxi
export GOPATH="$HOME/go"
cd $GOPATH/src/github.com/josenk/terraform-provider-esxi
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-w -extldflags "-static"' -o terraform-provider-esxi_`cat version`
cp terraform-provider-esxi_`cat version` /usr/bin

Siamo quasi al traguardo. Iniziamo a distribuire la nostra immagine.

Passiamo alla cartella:

cd /root/create-and-deploy-esxi/centos7

Per prima cosa, modifichiamo il file variables.tf. È necessario specificare la connessione al server ESXi.

Nel file network_config.cfg conterrà le impostazioni di rete della futura macchina virtuale. Cambiamo secondo le nostre necessità e lanciamo il comando in una riga:

sed -i -e '2d' -e '3i "network": "'$(gzip < network_config.cfg| base64 | tr -d 'n')'",' metadata.json

E nel file main.tf modifichiamo il percorso del file ova se differisce.

Il momento della verità.

terraform init
Inizializzazione del backend...

Inizializzazione dei plugin del provider...

I seguenti provider non hanno vincoli di versione nella configurazione,
quindi è stata installata l'ultima versione.

Per evitare aggiornamenti automatici a nuove versioni major che potrebbero contenere
modifiche incompatibili, è consigliabile aggiungere vincoli di versione = "..."
ai blocchi di provider corrispondenti nella configurazione, con le stringhe di vincolo
suggerite di seguito.

* provider.esxi: versione = "~> 1.6"
* provider.template: versione = "~> 2.1"

Terraform è stato inizializzato con successo!

Ora puoi iniziare a lavorare con Terraform. Prova a eseguire "terraform plan" per vedere
le eventuali modifiche necessarie per la tua infrastruttura. Tutti i comandi di Terraform
ora dovrebbero funzionare.

Se un giorno imposti o modifichi i moduli o la configurazione del backend per Terraform,
esegui di nuovo questo comando per reinizializzare la tua directory di lavoro. Se dimentichi,
altri comandi lo rileveranno e ti ricorderanno di farlo se necessario.

terraform plan
Aggiornamento dello stato di Terraform in memoria prima del piano...
Lo stato aggiornato sarà utilizzato per calcolare questo piano, ma non sarà
persistito nello stato locale o remoto.

data.template_file.Default: Aggiornamento dello stato...
data.template_file.network_config: Aggiornamento dello stato...

------------------------------------------------------------------------

È stato generato un piano di esecuzione e viene mostrato di seguito.
Le azioni sulle risorse sono indicate dai seguenti simboli:
  + creare

Terraform eseguirà le seguenti azioni:

  # esxi_guest.Default sarà creato
  + risorsa "esxi_guest" "Default" {
      + dimensione_boot_disk      = (nota dopo l'applicazione)
      + archivio_disco             = "datastore1"
      + nome_guest                = "centos7-test"
      + timeout_shut_down_guest  = (nota dopo l'applicazione)
      + timeout_start_up_guest    = (nota dopo l'applicazione)
      + informazioni_guest         = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                    = (nota dopo l'applicazione)
      + id                         = (nota dopo l'applicazione)
      + indirizzo_ip               = (nota dopo l'applicazione)
      + dimensione_memoria         = "1024"
      + annotazioni                = (nota dopo l'applicazione)
      + numvcpus                  = (nota dopo l'applicazione)
      + timer_proprietà_ovf       = (nota dopo l'applicazione)
      + sorgente_ovf               = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + alimentazione              = "on"
      + nome_pool_risorse         = (nota dopo l'applicazione)
      + version_hardware_virtuale  = (nota dopo l'applicazione)

      + interfacce_rete {
          + indirizzo_mac       = (nota dopo l'applicazione)
          + tipo_nic           = (nota dopo l'applicazione)
          + rete_virtuale      = "VM Network"
        }
    }

Piano: 1 da aggiungere, 0 da cambiare, 0 da distruggere.

------------------------------------------------------------------------

Nota: Non hai specificato un parametro "-out" per salvare questo piano, quindi Terraform
non può garantire che esattamente queste azioni verranno eseguite se
"terraform apply" viene successivamente eseguito.

Fine:

terraform apply

Se tutto è stato fatto correttamente, una nuova macchina virtuale sarà distribuita in 2-3 minuti dall'immagine precedentemente creata.

Le possibilità di utilizzo di tutto ciò sono limitate solo dalla fantasia.

Volevo semplicemente condividere i miei lavori e mostrare i punti principali nella gestione di questi prodotti.

Grazie per l'attenzione!

P.S.: sarò felice di ricevere critiche costruttive.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster