Distribuzione rapida di vm ESXi con Terraform

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

Vorrei raccontarvi come installo macchine virtuali su ESXi senza vCenter utilizzando Terraform.

Spesso devo installare/riprogettare macchine virtuali per testare varie applicazioni. Per pigrizia, ho pensato all'automazione del processo. Le mie ricerche mi hanno portato a un prodotto eccezionale dell'azienda hashicorp, terraform.

Penso che molti sappiano cos'è Terraform, ma 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 si può usare vCenter Server?

Certo, ma. In primo luogo, è una licenza aggiuntiva, in secondo luogo, questo prodotto è molto esigente in termini di risorse e semplicemente non ci starebbe sul mio server domestico, e in terzo luogo, offre la possibilità di migliorare le proprie abilità.

Come server utilizzo la piattaforma Intel NUC:

CPU: 2 CPUs 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ì, tutto in ordine.

Procediamo a configurare ESXi, in particolare apriamo la porta VNC nelle impostazioni del firewall.

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

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

Aggiungiamo il seguente blocco alla fine del file:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Usciamo e salviamo. Ripristiniamo i permessi e riavviamo il servizio:

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

È valido fino al riavvio dell'host. Dopo di che, dovremo ripetere questa operazione.

Procederò a svolgere 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

In seguito avremo bisogno di packer, un prodotto dell'azienda HashiCorp.

Serve per la creazione automatica di un "immagine d'oro". 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
packer version
Packer v1.5.5

Nel passaggio versione del packer potrebbe verificarsi un errore, poiché in RedHat-based potrebbe trovarsi un pacchetto con lo stesso nome.

which -a packer
/usr/sbin/packer

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

Ora ci serve ovftool link per il 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...completata.
Devi accettare il contratto di licenza per l'utente finale del componente VMware OVF Tool per Linux per continuare. Premi Invio per procedere.
CONTRATTO DI LICENZA PER L'UTENTE FINALE VMWARE
Sei d'accordo? [sì/no]:sì
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.

Proseguiamo.

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 è necessario posizionare il disco di installazione del sistema operativo. Nel mio caso si tratta di centos 7.

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

variabili: specificare i propri dati per la connessione
iso_urls: indicare l'URL aggiornato
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 circa 7-8 minuti.

Dopo il completamento con successo, nella cartella output-packer-centos7-x86_64 si troverà il file ova.

Installiamo 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.

Installiamo 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

Ora compiliamo 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 alla fine. Iniziamo a distribuire la nostra immagine.

Accediamo alla cartella:

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

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

Nel file network_config.cfg qui conterranno le configurazioni di rete della futura macchina virtuale. Modifichiamo secondo le nostre esigenze e avviamo la riga di comando:

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 secondo le nostre necessità, se diverso.

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 prevenire aggiornamenti automatici a nuove versioni principali che potrebbero contenere
modifiche non retrocompatibili, è consigliabile aggiungere vincoli di versione = "..."
per i blocchi del provider corrispondenti nella configurazione, con le stringhe di vincolo
suggerite qui sotto.

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

Terraform è stato inizializzato con successo!

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

Se mai imposti o cambi i moduli o la configurazione del backend per Terraform,
riesegui questo comando per reinizializzare la tua directory di lavoro. Se te ne scordi, altri
comandi lo rileveranno e ti ricorderanno di farlo se necessario.

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

data.template_file.Default: Rinfrescando stato...
data.template_file.network_config: Rinfrescando stato...

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

È stato generato un piano di esecuzione, mostrato qui sotto.
Le azioni sulle risorse sono indicate con i seguenti simboli:
  + crea

Terraform eseguirà le seguenti azioni:

  # esxi_guest.Default verrà creato
  + risorsa "esxi_guest" "Default" {
      + dimensione_disco_avvio  = (conosciuto dopo l'applicazione)
      + archivio_disco            = "datastore1"
      + nome_guest                = "centos7-test"
      + timeout_shutdown_guest    = (conosciuto dopo l'applicazione)
      + timeout_startup_guest     = (conosciuto dopo l'applicazione)
      + info_guest                = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + sistema_guest             = (conosciuto dopo l'applicazione)
      + id                        = (conosciuto dopo l'applicazione)
      + indirizzo_ip             = (conosciuto dopo l'applicazione)
      + memoria                   = "1024"
      + note                     = (conosciuto dopo l'applicazione)
      + numvcpus                 = (conosciuto dopo l'applicazione)
      + timer_proprietà_ovf      = (conosciuto 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        = (conosciuto dopo l'applicazione)
      + versione_hw_virtuale      = (conosciuto dopo l'applicazione)

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

Piano: 1 da aggiungere, 0 da modificare, 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" verrà eseguito successivamente.

Fine:

terraform apply

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

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

Volevo solo condividere le mie scoperte e mostrare i punti principali nell'utilizzo di questi prodotti.

Grazie per l'attenzione!

P.S.: sarei 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