Después de mi reciente seminario web de HashiCorp sobre VMware-As-Code, un colega de VMware con el que no había trabajado antes, se puso en contacto. Nicolas trabaja en el equipo de equilibrio de carga avanzado de VMware NSX (anteriormente conocido como AVI) y además de compartir un nombre y una nacionalidad, ¡ambos compartimos el amor por la automatización!
Comenzamos a trabajar en un proyecto para automatizar la implementación de la solución de equilibrio de carga en VMware Cloud on AWS (y la mayor parte se aplica a cualquier entorno de vCenter).
Puede recordar que escribí una publicación anterior sobre soluciones de equilibrio de carga; antes de la adquisición de AVI , ya había escrito en un blog sobre la implementación de AVI en VMware Cloud, pero gran parte de la implementación era manual y requería cierto conocimiento de la arquitectura general de AVI y los conceptos de controladores y motor de servicio.
Y si bien no fue tan difícil, ¿no sería bueno implementar un equilibrador de carga completamente configurado + una aplicación de muestra de dos niveles sin esfuerzo absoluto Y con poco o ningún conocimiento de habilidades de automatización?
Resultó que Nicolas B ya había realizado una gran cantidad de automatización con Avi y vCenter, pero necesitábamos probarlo, validarlo y documentarlo con VMware Cloud en AWS.
Requisitos
Preparando el controlador AVI y las imágenes de Ubuntu
Primero, necesitaremos descargar el controlador AVI. Diríjase a https://portal.avinetworks.com , regístrese (desafortunadamente se requiere aprobación manual, pero es de esperar que el software se traslade pronto a my.vmware.com ), vaya a Software y descargue el controlador OVA.
Debería ser algo como:
1 | controller-20.1.2-9171.ova |
También le recomendamos que descargue una imagen de Ubuntu, que se utilizará como cuadro de salto y para la aplicación de muestra. Puedes descargarlo directamente aquí .
Ahora que tiene los OVA descargados, solo necesita cargarlos como plantilla.
Una de las formas de hacer esto sería usar OVFTool y, afortunadamente, William Lam tenía algunas publicaciones de blog útiles sobre esto:
Por alguna razón (probablemente mis dedos gordos), me tomó más tiempo hacer que el script funcionara, así que para la posteridad, aquí puedes importar fácilmente los OVA descargados a VMC. Actualice la configuración según sea necesario.
123 | ovftool.exe --acceptAllEulas --allowAllExtraConfig --name=controller-20.1.1-9071-template --datastore=WorkloadDatastore --network:EMEA-VMC-TEST-01 --vmFolder=Templates --importAsTemplate C:\Users\nvibert\Downloads\controller-20.1.2-9171.ova vi : //cloudadmin @vmc. local :[email protected] /SDDC-Datacenter/host/Cluster-1/Resources/Compute-ResourcePool/ ovftool.exe --acceptAllEulas --allowAllExtraConfig --name=ubuntu-bionic-18.04-cloudimg-template --datastore=WorkloadDatastore --network:EMEA-VMC-TEST-01 --vmFolder=Templates --importAsTemplate C:\Users\nvibert\Downloads\bionic-server-cloudimg-amd64.ova vi : //cloudadmin @vmc. local :[email protected] /SDDC-Datacenter/host/Cluster-1/Resources/Compute-ResourcePool/ |
Solo asegúrese de tener acceso directo al host ESXi desde la VM que ejecuta OVFtool, como Willian explicó en su blog.
Alternativamente, implemente la VM desde OVF y conviértala en una plantilla.
Configuración del acceso a vCenter y ESXi
Solo asegúrese de permitir el acceso a vCenter y ESXi para el aprovisionamiento:
Configurar las variables
En mi Mac, sería simplemente
123456 | export TF_VAR_vmc_nsx_server=https://nsx-1-2-3-4.rp.vmwarevmc.com/vmc/reverse-proxy/api/orgs/aaaa-bbbb-cccc-dddd/sddcs/eeee-ffff-gggg-hhhh export TF_VAR_vmc_nsx_token=XXXXXXXXXXXXXXXXXXXXXXXXX export TF_VAR_vmc_org_id=aaaa-bbbbb-ccccc-ddddd export TF_VAR_vmc_vsphere_password=password export TF_VAR_vmc_vsphere_server=vcenter.sddc-1-2-3-4.vmwarevmc.com export [email protected] |
Si la contraseña incluye un carácter que no le gusta a la Terminal Mac, envuelva las contraseñas con el símbolo ‘.
Establecer la clave pública
Debe configurar un par de claves RSA para habilitar la conectividad entre el host de salto y el controlador. La forma más sencilla de hacerlo es con ssh-keygen :
123456789101112131415dieciséis1718192021 | root@terraform-test:~/aviVMC# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): cloudKey Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in cloudKey. Your public key has been saved in cloudKey.pub. The key fingerprint is: SHA256:----------------------- root@terraform-test The key's randomart image is: +---[RSA 2048]----+ | | | o . | | = + o | | = o o | | + S @ o | | .X . o ^ B + | | oo=.o = X + . | | ...o o+ . + | | oo.o..E . | +----[SHA256]-----+ |
Solo tome nota de dónde está implementando la clave, ya que es posible que necesite actualizar la ruta.
Instalación de Terraform
La herramienta aprovecha Terraform. Si bien no necesita conocer Terraform para aprovechar esta herramienta, deberá instalar Terraform en su cliente.
Preparándose
Ya casi llegamos, solo ve a tu terminal y clona el repositorio de GitHub con el código (esta publicación de blog se basa en la versión del repositorio v1.08 ):
git clone https: //github .com /tacobayle/aviVmc ; cd aviVmc |
En variables.tf , solo necesitará actualizar la ruta a quien haya creado el par de claves; para mí, significó hacer esto:
123 | public_key_path = "cloudKey.pub" private_key_path = "cloudKey" |
Todo lo demás, puedes dejarlo como está. Por supuesto, puede actualizar el script como mejor le parezca.
¡Vamonos!
Ahora solo se requieren dos comandos: terraform init :
123456789101112131415dieciséis17181920212223242526272829303132333435 | nvibert-a01:aviVmc nicolasvibert$ terraform init Initializing the backend... Initializing provider plugins... - Using previously-installed hashicorp/null v3.0.0 - Using previously-installed hashicorp/template v2.2.0 - Using previously-installed terraform-providers/nsxt v3.1.0 - Using previously-installed hashicorp/vsphere v1.24.2 - Using previously-installed hashicorp/time v0.6.0 - Using previously-installed terraform-providers/vmc v1.4.0 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, we recommend adding version constraints in a required_providers block in your configuration, with the constraint strings suggested below. * hashicorp/null: version = "~> 3.0.0" * hashicorp/template: version = "~> 2.2.0" * hashicorp/time: version = "~> 0.6.0" * hashicorp/vsphere: version = "~> 1.24.2" * terraform-providers/nsxt: version = "~> 3.1.0" * terraform-providers/vmc: version = "~> 1.4.0" 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. |
Ahora está listo para crear todos los recursos:
123456789101112131415dieciséis171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364sesenta y cinco6667 | nvibert-a01:aviVmc nicolasvibert$ terraform apply var.avi_password Enter a value: VMware1!VMware1! var.vmc_vsphere_password Enter a value: mvA*u!S3VY8GxsL data.template_file.jumpbox_userdata: Refreshing state... data.template_file.mysql_userdata[0]: Refreshing state... data.template_file.opencart_userdata[0]: Refreshing state... data.template_file.opencart_userdata[1]: Refreshing state... data.template_file.backend_userdata[0]: Refreshing state... data.template_file.backend_userdata[1]: Refreshing state... data.template_file.client_userdata[0]: Refreshing state... data.vsphere_datacenter.dc: Refreshing state... data.vsphere_virtual_machine.client: Refreshing state... data.vsphere_compute_cluster.compute_cluster: Refreshing state... data.vsphere_virtual_machine.backend: Refreshing state... data.vsphere_virtual_machine.mysql: Refreshing state... data.vsphere_datastore.datastore: Refreshing state... data.vsphere_virtual_machine.opencart: Refreshing state... data.vsphere_virtual_machine.controller_template: Refreshing state... data.vsphere_resource_pool.pool: Refreshing state... data.vsphere_virtual_machine.jump: Refreshing state... data.nsxt_policy_transport_zone.tzMgmt: Refreshing state... An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create <= read (data resources) Terraform will perform the following actions: # data.vsphere_network.networkBackend will be read during apply # (config refers to values not yet known) <= data "vsphere_network" "networkBackend" { + datacenter_id = "datacenter-3" + id = (known after apply) + name = "avi-backend" + type = (known after apply) } # data.vsphere_network.networkMgmt will be read during apply # (config refers to values not yet known) <= data "vsphere_network" "networkMgmt" { + datacenter_id = "datacenter-3" + id = (known after apply) + name = "avi-mgmt" + type = (known after apply) } Plan: 55 to add, 0 to change, 0 to destroy. Do you want to perform these actions? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value: yes vsphere_tag_category.ansible_group_jump: Creating... vsphere_tag_category.ansible_group_opencart: Creating... vsphere_tag_category.ansible_group_client: Creating... vsphere_tag_category.ansible_group_mysql: Creating... vsphere_tag_category.ansible_group_controller: Creating... vsphere_folder.folderSe: Creating... vsphere_tag_category.ansible_group_backend: Creating... |
Este script es bastante extenso y hará lo siguiente:
- Cree 2 carpetas dentro de vCenter
- Cree 7 grupos NSX-T
- Cree 3 segmentos NSX-T
- Cree 12 etiquetas de vSphere
- Encienda 1 máquina virtual de Avi Controller
- Activa 2 VM de backend
- Gire 2 máquinas virtuales web opencart
- Encienda 1 máquina virtual mysql
- Activar 1 VM de cliente
- Gire 1 salto VM con ansible instalado: datos de usuario para instalar paquetes
- Solicite 6 IP públicas para Jump host, Controller y Virtual Services
- Cree 6 reglas NAT de NSX-T para servicios virtuales, controlador y host de salto
- Cree 7 grupos de políticas NSX-T para Jump host, Controller y servicios virtuales
- Cree 2 servicios NSX-T para servicios virtuales (solo HTTP (tcp / 80 y tcp / 443) y DNS (udp / 53))
- Cree 7 políticas de puerta de enlace de NSX-T para servicios virtuales, controladores y host de salto
- Cree un archivo de variable yaml – en el servidor de salto
- Llame a Ansible para ejecutar la configuración de opencart (clon de git)
- Llame a Ansible para hacer la configuración de Avi (git clone)
¡Resultados!
Los resultados son bastante espectaculares, revisémoslos.
Toda la configuración de redes y VMC se realiza con Terraform y las API:
vCenter se ha configurado con VM, etiquetas y categorías:
Y se han implementado dos aplicaciones de muestra. La primera es una «tienda de aplicaciones» de código abierto de aspecto muy inteligente llamada Opencart :
La segunda es una aplicación de carga equilibrada muy simple:
¿Qué pasa con AVI? Bueno, tanto el plano de control (controlador AVI) como el plano de datos (motores de servicio AVI) se han implementado automáticamente. Puede ver a continuación los grupos de equilibradores de carga:
Las IP virtuales:
Y los motores de servicio:
Y lo que es aún más sorprendente es el nivel de visibilidad que obtiene de cada servicio: ¡impresionante!
Video guía
En este primer video, Nic y yo repasamos los preparativos y los requisitos…
Volvemos media hora después para ver la infraestructura desplegada por el script
Y finalmente, repasamos las aplicaciones desplegadas del script y la gran visibilidad que brinda el AVI Load-Balancer
¡Gracias por leer y mirar! Si tiene algún comentario sobre la herramienta, conéctese en Twitter, LinkedIn o mediante GitHub.
Fuente: Blog de Nico Vibert