Implementación rápida vm ESXi con Terraform

Ola a todos, chámome Ivan e son un administrador do sistema de alcohólicos (OPS).

Gustaríame contarche como implemento máquinas virtuais en ESXi sen vCenter usando Terraform.

Moitas veces, tes que implementar/recrear máquinas virtuais para probar esta ou aquela aplicación. Debido á preguiza, pensei en automatizar o proceso. A miña busca levoume a un produto marabilloso da empresa hashicorp, terraform.

Creo que moita xente sabe o que é Terraform, e quen non o sabe, esta é unha aplicación para xestionar calquera nube, infraestrutura ou servizo usando o concepto IasC (Infraestrutura como código).

Eu uso ESXi como o meu entorno de virtualización. Moi sinxelo, cómodo e fiable.
Anticipo unha pregunta.

Por que terraform cando podes usar vCenter Server?

Podes por suposto, pero. En primeiro lugar, esta é unha licenza adicional, en segundo lugar, este produto consume moito recursos e simplemente non encaixa no meu servidor doméstico e, en terceiro lugar, a capacidade de actualizar as habilidades.

A plataforma Intel NUC actúa como servidor:

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 así, primeiro o primeiro.

De momento, configuremos esxi, é dicir, abra o porto VNC na configuración do firewall.

Por defecto, o ficheiro está protexido contra escritura. Realizamos as seguintes manipulacións:

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

engade o seguinte bloque ao final do ficheiro:

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

Saír, gardar. Cambia de novo os dereitos e reinicia o servizo:

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

Actual ata que se reinicie o host. Despois diso, esta manipulación terá que repetirse.

Ademais, realizarei todo o traballo nunha máquina virtual no mesmo servidor.

Especificacións:

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

A continuación, necesitamos empaquetador, tamén un produto de HashiCorp.

É necesario para montar automaticamente a imaxe "dourada". que utilizaremos no 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

En movemento versión packer pode ocorrer un erro, xa que baseado en RedHat pode conter un paquete co mesmo nome.

which -a packer
/usr/sbin/packer

Para a solución, pode crear unha ligazón simbólica ou usar unha ruta absoluta /usr/bin/packer.

Agora necesitamos ovftool ligazón para descargar. Descarga, pon no servidor e instala:

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.

Seguimos adiante.

No gith preparei todo o que necesitas.

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

Ao cartafol ISO cómpre poñer o kit de distribución do sistema operativo. No meu caso, este é centos 7.

Tamén cómpre editar o ficheiro. centos-7-base.json:

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

Despois de todos os cambios, executa a asemblea:

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

Se todo está configurado e especificado correctamente, entón verás unha imaxe da instalación automática do sistema operativo. Este proceso lévame 7-8 minutos.

Despois de completar correctamente no cartafol output-packer-centos7-x86_64 localizarase o ficheiro ova.

Instalar 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

Dado que Terraform non ten un provedor para ESXi, cómpre crear un.

Poñemos ir:

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

A continuación, recollemos o provedor:

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

Estamos na meta. Imos tirar a nosa imaxe.

Imos ao cartafol:

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

En primeiro lugar, edita o ficheiro variables.tf. Debe especificar unha conexión co servidor ESXi.

En arquivo network_config.cfg contén a configuración de rede da futura máquina virtual. Cambia ás túas necesidades e executa a liña única:

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

Pois no arquivo principal.tf cambia o camiño ao ficheiro ova polo teu, se é diferente.

O momento da verdade.

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.

Remate:

terraform apply

Se todo está feito correctamente, en 2-3 minutos despregarase unha nova máquina virtual a partir da imaxe feita anteriormente.

Os usos de todo isto están limitados só pola túa imaxinación.

Só quería compartir as mellores prácticas e mostrar os puntos principais ao traballar con estes produtos.

Grazas pola atención!

PD: Estarei encantado de facer unha crítica construtiva.

Fonte: www.habr.com

Engadir un comentario