Distribuzione rapida di vm ESXi con Terraform

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

Vorrei dirti come distribuisco macchine virtuali su ESXi senza vCenter utilizzando Terraform.

Molto spesso, devi distribuire / ricreare macchine virtuali per testare questa o quell'applicazione. Per pigrizia, ho pensato di automatizzare il processo. La mia ricerca mi ha portato a un meraviglioso prodotto dell'azienda hashicorp, Terraform.

Penso che molte persone sappiano cos'è Terraform e chi non lo sa, questa è un'applicazione per la gestione di qualsiasi cloud, infrastruttura o servizio utilizzando il concetto IasC (Infrastruttura come codice).

Uso ESXi come ambiente di virtualizzazione. Abbastanza semplice, conveniente e affidabile.
Anticipo una domanda.

Perché terraformare quando puoi utilizzare vCenter Server?

Certo che puoi, ma. In primo luogo, questa è una licenza aggiuntiva, in secondo luogo, questo prodotto richiede molte risorse e semplicemente non si adatta al mio server di casa e, in terzo luogo, la possibilità di aggiornare le competenze.

La piattaforma Intel NUC funge da server:

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

E quindi, prima le cose importanti.

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

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

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

aggiungere il seguente blocco alla fine del file:

<service id="1000">
  <id>packer-vnc</id>
  <rule id="0000">
    <direction>inbound</direction>
    <protocol>tcp</protocol>
    <porttype>dst</porttype>
    <port>
      <begin>5900</begin>
      <end>6000</end>
    </port>
  </rule>
  <enabled>true</enabled>
  <required>true</required>
</service>

Esci, salva. Ripristina i diritti e riavvia il servizio:

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

Attivo fino al riavvio dell'host. Successivamente, questa manipolazione dovrà essere ripetuta.

Inoltre, eseguirò tutto il lavoro in una macchina virtuale sullo stesso server.

Caratteristiche:

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

Successivamente, abbiamo bisogno Packer, anch'esso un prodotto di HashiCorp.

È necessario per assemblare automaticamente l'immagine "d'oro". che useremo 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

In movimento versione imballatrice potrebbe verificarsi un errore, poiché basato su RedHat potrebbe contenere un pacchetto con lo stesso nome.

which -a packer
/usr/sbin/packer

Per la soluzione, puoi creare un collegamento simbolico o utilizzare un percorso assoluto /usr/bin/packer.

Ora abbiamo bisogno di ovftool link per il download. Scarica, metti sul server e installa:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extracting VMware Installer...done.
You must accept the VMware OVF Tool component for Linux End User
License Agreement to continue.  Press Enter to proceed.
VMWARE END USER LICENSE AGREEMENT
Do you agree? [yes/no]:yes
The product is ready to be installed.  Press Enter to begin
installation or Ctrl-C to cancel. 
Installing VMware OVF Tool component for Linux 4.4.0
    Configuring...
[######################################################################] 100%
Installation was successful.

Andiamo avanti.

Sul gith ho preparato tutto ciò di cui hai bisogno.

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

Alla cartella iso è necessario inserire il kit di distribuzione del sistema operativo. Nel mio caso, questo è centos 7.

Devi anche modificare il file. centos-7-base.json:

variables: указать свои данные для подключения
iso_urls: указать актуальный
iso_checksum: чексумма вашего образа 

Dopo tutte le modifiche, esegui l'assembly:

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

Se tutto è configurato e specificato correttamente, vedrai un'immagine dell'installazione automatica del sistema operativo. Questo processo mi richiede 7-8 minuti.

Dopo il completamento con successo nella cartella output-packer-centos7-x86_64 verrà individuato il 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
terraform version
Terraform v0.12.24

Poiché Terraform non dispone di un provider per ESXi, è necessario crearne uno.

Mettiamo andare:

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, raccogliamo 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 al traguardo. Andiamo a stendere la nostra immagine.

Andiamo nella cartella:

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

Prima di tutto, modifica il file variabili.tf. È necessario specificare una connessione al server ESXi.

In archivio rete_config.cfg contenere le impostazioni di rete della futura macchina virtuale. Cambia in base alle tue esigenze ed esegui il one-liner:

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

Bene, nel file principale.tf cambia il percorso del file ova con il tuo, se diverso.

Il momento della verità.

terraform init
Initializing the backend...

Initializing provider plugins...

The following providers do not have any version constraints in configuration,
so the latest version was installed.

To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.

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

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.

terraform plan
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.

data.template_file.Default: Refreshing state...
data.template_file.network_config: Refreshing state...

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

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # esxi_guest.Default will be created
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (known after apply)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (known after apply)
      + guest_startup_timeout  = (known after apply)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (known after apply)
      + id                     = (known after apply)
      + ip_address             = (known after apply)
      + memsize                = "1024"
      + notes                  = (known after apply)
      + numvcpus               = (known after apply)
      + ovf_properties_timer   = (known after apply)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (known after apply)
      + virthwver              = (known after apply)

      + network_interfaces {
          + mac_address     = (known after apply)
          + nic_type        = (known after apply)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

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

Note: You didn't specify an "-out" parameter to save this plan, so Terraform
can't guarantee that exactly these actions will be performed if
"terraform apply" is subsequently run.

Fine:

terraform apply

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

Gli usi per tutto questo sono limitati solo dalla tua immaginazione.

Volevo solo condividere le migliori pratiche e mostrare i punti principali quando si lavora con questi prodotti.

Grazie!

PS: Sarò lieto di critiche costruttive.

Fonte: habr.com

Aggiungi un commento