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 , .
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.xmlAggiungiamo alla fine del file il seguente blocco:
packer-vnc
inbound
tcp
dst
5900
6000
true
trueUscendo, salviamo. Cambiamo i permessi di nuovo e riavviamo il servizio:
chmod 444 /etc/vmware/firewall/service.xml
esxcli network firewall refreshValido 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: disabilitatoDopo avremo bisogno di , 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.5Nella fase versione packer può verificarsi un errore, poiché in RedHat-based potrebbe trovarsi un pacchetto con lo stesso nome.
which -a packer
/usr/sbin/packerPer risolvere, è possibile creare un symlink o utilizzare il percorso assoluto /usr/bin/packer.
Ora abbiamo bisogno di ovftool . 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-esxiNella 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.jsonSe 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.24Poiché 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/amd64Successivamente 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/binSiamo quasi al traguardo. Iniziamo a distribuire la nostra immagine.
Passiamo alla cartella:
cd /root/create-and-deploy-esxi/centos7Per 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.jsonE 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 applySe 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
