Despliegue rápido de vm ESXi con Terraform

Hola a todos, me llamo Iván y soy un administrador de sistemas (OPS) alcohólico.

Me gustaría contar cómo despliego máquinas virtuales en ESXi sin vCenter usando Terraform.

A menudo tengo que desplegar/recrear máquinas virtuales para probar alguna aplicación. Debido a la pereza, pensé en automatizar el proceso. Mis búsquedas me llevaron a un producto maravilloso de la empresa hashicorp, terraform.

Creo que muchos saben qué es Terraform, y para los que no lo saben, es una aplicación para gestionar cualquier nube, infraestructura o servicio utilizando el concepto de IasC (Infraestructura como código).

Como entorno de virtualización, utilizo ESXi. Es bastante simple, conveniente y fiable.
Preveo la pregunta.

¿Para qué usar terraform si se puede utilizar vCenter Server?

Se puede, por supuesto, pero. Primero, es una licencia adicional; segundo, este producto es muy exigente en recursos y simplemente no cabría en mi servidor doméstico; y tercero, es una oportunidad para mejorar habilidades.

La plataforma es un servidor Intel NUC:

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

Y así, todo en orden.

Por ahora, configuramos esxi, es decir, abramos el puerto VNC en la configuración del firewall.

Por defecto, el archivo está protegido contra escritura. Realizamos las siguientes manipulaciones:

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

Añadimos el siguiente bloque al final del archivo:

packer-vnc
  
    inbound
    tcp
    dst
    
      5900
      6000
    
  
  true
  true

Salimos, guardamos. Cambiamos los permisos de nuevo y reiniciamos el servicio:

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

Válido hasta el reinicio del host. Después de eso, esta manipulación tendrá que repetirse.

A partir de ahora, todo el trabajo lo haré en la máquina virtual en este mismo servidor.

Características:

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

A continuación, necesitaremos packer, también es un producto de HashiCorp.

Se necesita para la construcción automática de una "imagen dorada". Que vamos a utilizar en el 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 el paso packer version Puede aparecer un error, ya que en RedHat-based puede haber un paquete con el mismo nombre.

which -a packer
/usr/sbin/packer

Para solucionarlo, se puede crear un symlink o usar la ruta absoluta. /usr/bin/packer.

Ahora necesitaremos ovftool. enlace de descarga. Descargamos, lo colocamos en el servidor e instalamos:

chmod +x VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
./VMware-ovftool-4.4.0-15722219-lin.x86_64.bundle
Extrayendo el instalador de VMware...hecho.
Debe aceptar el acuerdo de licencia del usuario final para el componente VMware OVF Tool para Linux para continuar. Presione Enter para continuar.
ACUERDO DE LICENCIA DEL USUARIO FINAL DE VMWARE
¿Está de acuerdo? [sí/no]:sí
El producto está listo para ser instalado. Presione Enter para comenzar la instalación o Ctrl-C para cancelar.
Instalando el componente VMware OVF Tool para Linux 4.4.0
    Configurando...
[######################################################################] 100%
La instalación fue exitosa.

Continuemos.

En Git he preparado todo lo necesario.

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

En la carpeta iso necesitamos colocar el distribuidor del sistema operativo. En mi caso, es centos 7.

También es necesario editar el archivo centos-7-base.json:

variables: especificar sus datos de conexión
iso_urls: indicar el actual
iso_checksum: el checksum de su imagen 

Después de todos los cambios, iniciamos la compilación:

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

Si todo está configurado y especificado correctamente, verá la imagen de la instalación automática del sistema operativo. Este proceso me toma de 7 a 8 minutos.

Tras una finalización exitosa, en la carpeta output-packer-centos7-x86_64 se encontrará el archivo ova.

Instalamos 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

Dado que Terraform no tiene un proveedor para ESXi, necesitamos compilarlo.

Instalamos 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

A continuación, compilamos el proveedor:

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 en la recta final. Vamos a desplegar nuestra imagen.

Entramos en la carpeta:

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

Primero, editamos el archivo variables.tf. Necesitamos especificar la conexión al servidor ESXi.

En el archivo network_config.cfg se contendrán las configuraciones de red de la futura máquina virtual. Cambiamos según nuestras necesidades y ejecutamos el script de una línea:

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

Y en el archivo main.tf cambiamos la ruta al archivo ova por nuestra, si es diferente.

El momento de la verdad.

terraform init
Inicializando el backend...

Inicializando los complementos del proveedor...

Los siguientes proveedores no tienen restricciones de versión en la configuración,
por lo que se instaló la última versión.

Para evitar actualizaciones automáticas a nuevas versiones principales que puedan contener cambios
rompedores, se recomienda añadir restricciones de versión = "..." a los
bloques de proveedores correspondientes en la configuración, con las cadenas de restricciones
sugeridas a continuación.

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

¡Terraform se ha inicializado con éxito!

Ahora puedes comenzar a trabajar con Terraform. Intenta ejecutar "terraform plan" para ver
cualquier cambio que se requiera para tu infraestructura. Todos los comandos de Terraform
deben funcionar ahora.

Si alguna vez configuras o cambias módulos o la configuración del backend para Terraform,
vuelve a ejecutar este comando para reinicializar tu directorio de trabajo. Si olvidaste,
otros comandos lo detectarán y te recordarán hacerlo si es necesario.

terraform plan
Refrescando el estado de Terraform en memoria antes del plan...
El estado refrescado se utilizará para calcular este plan, pero no se persistirá en el almacenamiento de estado local o remoto.

data.template_file.Default: Refrescando estado...
data.template_file.network_config: Refrescando estado...

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

Se ha generado un plan de ejecución y se muestra a continuación.
Las acciones de recursos se indican con los siguientes símbolos:
  + crear

Terraform llevará a cabo las siguientes acciones:

  # esxi_guest.Default será creado
  + resource "esxi_guest" "Default" {
      + boot_disk_size         = (conocido después de aplicar)
      + disk_store             = "datastore1"
      + guest_name             = "centos7-test"
      + guest_shutdown_timeout = (conocido después de aplicar)
      + guest_startup_timeout  = (conocido después de aplicar)
      + guestinfo              = {
          + "metadata"          = "base64text"
          + "metadata.encoding" = "gzip+base64"
          + "userdata"          = "base64text"
          + "userdata.encoding" = "gzip+base64"
        }
      + guestos                = (conocido después de aplicar)
      + id                     = (conocido después de aplicar)
      + ip_address             = (conocido después de aplicar)
      + memsize                = "1024"
      + notes                  = (conocido después de aplicar)
      + numvcpus               = (conocido después de aplicar)
      + ovf_properties_timer   = (conocido después de aplicar)
      + ovf_source             = "/root/create-and-deploy-esxi/output-packer-centos7-x86_64/packer-centos7-x86_64.ova"
      + power                  = "on"
      + resource_pool_name     = (conocido después de aplicar)
      + virthwver              = (conocido después de aplicar)

      + network_interfaces {
          + mac_address     = (conocido después de aplicar)
          + nic_type        = (conocido después de aplicar)
          + virtual_network = "VM Network"
        }
    }

Plan: 1 para agregar, 0 para cambiar, 0 para destruir.

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

Nota: No especificaste un parámetro "-out" para guardar este plan, por lo que Terraform
no puede garantizar que exactamente estas acciones se llevarán a cabo si
"terraform apply" se ejecuta posteriormente.

Fin:

terraform apply

Si todo se hizo correctamente, en 2-3 minutos se desplegará una nueva máquina virtual a partir de la imagen previamente creada.

Las posibilidades de uso de todo esto están limitadas solo por la imaginación.

Solo quería compartir mis hallazgos y mostrar los puntos principales al trabajar con estos productos.

¡Gracias por tu atención!

P.D.: estaré encantado de recibir críticas constructivas.

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster