Automatiza todo: Terraform, Ansible y Elastic Cloud Enterprise
Como continuación de nuestro primer blog, Automating the installation of Elastic Cloud Enterprise with Ansible (Automatización de la instalación de Elastic Cloud Enterprise con Ansible), en este blog se muestra cómo extender la automatización al provisionamiento en el cloud con Terraform. En el primer blog, detallamos cómo desplegar y configurar Elastic Cloud Enterprise (ECE) en tres zonas de disponibilidad en AWS con Ansible. Sin embargo, el provisionamiento de las instancias subyacentes de EC2 y la configuración de los grupos de seguridad eran completamente manuales.
En este blog, mejoraremos nuestra metodología usando Terraform para automatizar el provisionamiento y la configuración de esas instancias de EC2 y grupos de seguridad. También la usaremos para automatizar la instalación, configuración y ejecución del cuaderno de estrategias de Ansible que creamos la última vez. La automatización es buena.
Por cierto, ¿qué es Terraform? No está para nada relacionado con el dispositivo Genesis, como creímos en un comienzo. Según HashiCorp (los desarrolladores), es una herramienta para crear, cambiar y controlar las versiones de infraestructura usando configuración de alto nivel: infraestructura como código. Es útil por muchos motivos, entre ellos y no menos importante el hecho de que todo lo necesario para poner en marcha la infraestructura y configurarla reside en archivos de texto cuya versión se puede controlar y que se pueden CRUDear (¿existe esa palabra?) de forma programática.
Si bien en este blog nos enfocamos en AWS como Proveedor Cloud, puedes usar Terraform para provisionar y administrar recursos en cualquier Proveedor Cloud. Revisa su lista de Proveedores Cloud principales y la lista de Proveedores Cloud no principales (aparentemente). Encontrarás un ejemplo con GCP en nuestro repositorio de ejemplos en GitHub.
Por último, como antes, este blog es una demostración básica que creará un entorno de ECE adecuado para una pequeña prueba de concepto o entorno de desarrollo. Un despliegue de producción completo debería usar grupos de instancias, equilibradores de carga y otras construcciones de alta disponibilidad que no se incluyeron en esta configuración. Ve los documentos de planificación de Elastic Cloud Enterprise para conocer detalles adicionales sobre la planificación y despliegue de producción.
¿Comenzamos?
Tareas
Nuevamente seguiremos el ejemplo de instalación de línea de base pequeña de los documentos de ECE, pero nuestras tareas son bastante diferentes:
- Instalar Terraform
- Definir la infraestructura
- Ejecutarlo
- Celebrar con manos de jazz
Instalar Terraform
Para hacerlo, visita la documentación de HashiCorp. También necesitarás Ansible, el cual instalamos en el primer blog. Si aún no lo hiciste, revisa los documentos de Ansible. En una Macbook Pro con teclado frágil, hicimos lo siguiente:
> brew install terraform > brew install ansible
Es importante tener en cuenta que la configuración usada es compatible con Terraform versión 0.12. Usamos específicamente la versión 0.12.19.
Definir la infraestructura
Los pasos de esta tarea son los siguientes:
- Inicia la configuración de Terraform como nosotros.
- Explora las opciones para comprender lo que sucede.
- Configura algunas variables que, con suerte, serán tuyas exclusivamente.
Arrancar la configuración de Terraform
Como ya mencionamos, Terraform es una forma de provisionamiento de la infraestructura a través de archivos de configuración. Por lo tanto, hay muchos archivos de configuración. Para avanzar con más rapidez, clona el repositorio o descarga los archivos desde nuestro repositorio de ejemplos en GitHub. Todo lo que haremos será con estos archivos.
Como antes, los pasos están adaptados para personas con inclinación por la CLI, porque es mucho más difícil escribir instrucciones de apuntar y hacer clic.
Pasos
- Clona o descarga el repositorio de ejemplos.
> git clone https://github.com/elastic/examples.git
- Explora entre archivos hasta llegar a donde lo guardaste.
> cd /workspace/github/elastic/examples
- Navega hasta los ejemplos de Terraform en AWS en ECE.
> cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
- Prepárate para editar texto.
Explorar entre archivos
Deberías tener frente a ti los siguientes archivos. Explóralos, si así lo deseas.
terraform.tfvars.example | Luego de cambiar el nombre a terraform.tfvars , es el lugar principal en el que configuramos nuestros valores secretos y anulamos cualquier variable que deseemos en variables.tf .
|
variables.tf | Montones de variables, probablemente deberías echar un vistazo. |
provider.tf | Configuración de Terraform que le indica cómo conectarse a AWS. |
servers.tf | Configuración de Terraform para encontrar nuestra AMI deseada, desplegar nuestras instancias y capturar los metadatos de instancia que usará Ansible. |
networking.tf | Configuración de Terraform que realiza un montón de configuración de red de AWS: VPC, puerto de internet, tabla de enrutamiento, subred y grupos de seguridad. |
main.tf | Configuración de Terraform que inicia el script de Ansible y recopila una parte de la salida más importante. |
ansible-install.sh | El script que Terraform modificará y llamará para configurar y ejecutar Ansible con el rol de ECE. |
Configurar variables
Debemos configurar algunas variables diferentes para que esto te funcione (porque a nosotros ya nos funciona, pero esto se trata de ti).
- Un nombre de proyecto que se etiquetará en todos los recursos de AWS que se creen
- Tu IP, para que solo tú tengas acceso ssh a las instancias subyacentes (configurar
0.0.0.0/0
también funcionaría si deseas abrirla al mundo) - Credenciales de acceso de AWS para permitir que Terraform pueda provisionar
Si no tienes un par de claves de acceso/secreta de AWS, sigue los documentos de AWS para crearlo.
Nota: variables.tf
define una ubicación de archivo de claves públicas y privadas para usar para conectarse a través de ssh a las instancias de EC2. Si no tienes una clave ssh, te sugerimos que busques en Google. DigitalOcean tiene una descripción básica buena para Linux/OSX y Windows.
Pasos
- Cambia el nombre de
terraform.tfvars.example
aterraform.tfvars
. - En
terraform.tfvars
, realiza los cambios siguientes:- Configura un
project_name
usado para identificar todos tus recursos de AWS. - Configura
trusted_network
con tu IP en notación CIDR, o el rango que prefieras. - Configura
aws_access_key
yaws_secret_key
con tu información. - Opcionalmente, puedes anular
aws_region
,public_key
oprivate_key
.
- Configura un
Hay dos configuraciones que no te pedimos que cambies: las configuraciones de tipo de instancia EC2 y AMI. Los motivos son varios, pero principalmente es para reducir la complejidad durante los primeros pasos. Al igual que la última vez, nuestro plan es desplegar tres instancias i3.xlarge desde una AMI de CentOS 7.
- Para asegurarnos de que Terraform pueda encontrar la AMI adecuada, podemos proporcionarle varios metadatos. En este caso, usamos un patrón de nombre, un ID de propietario (el de centos.org) y un tipo de virtualización. El patrón de nombre y el ID de propietario se pueden configurar en
variables.tf
, pero ten en cuenta que si seleccionas una AMI diferente (por ejemplo, una con Ubuntu), podrías necesitar un valor diferente pararemote_user
. - Cambiar el tipo de instancia también tiene ramificaciones. Las i3 usan unidades NVMe conectadas de forma local con un nombre de dispositivo de SO específico y configuraciones de ajustes en Terraform. Si usas una instancia diferente y conectas volúmenes EBS, tendrás que cambiar
servers.tf
para mapearla correctamente. Consulta los documentos de Terraform para más información.
Las configuraciones que usamos para el tipo de instancia EC2 y AMI se pueden ver en variables.tf
.
# El nombre de la AMI en AWS Marketplace variable "aws_ami_name" { default = "CentOS Linux 7 x86_64 HVM*" } # El propietario de la AMI variable "aws_ami_owner" { default = "679593333241" # centos.org } # Usuario para iniciar sesión en instancias y realizar la instalación # Esto depende de la AMI que uses, asegúrate de que estén sincronizadas. Por ejemplo, una AMI de Ubuntu usaría el usuario de Ubuntu. variable "remote_user" { default = "centos" } # Tipo de instancia de ECE variable "aws_instance_type" { default = "i3.xlarge" } # El nombre del dispositivo del volumen no raíz que usará ECE # En las instancias i3, es nvme0n1. # Si usas un tipo de instancia diferente, este valor cambiará y quizá también requiera cambios en la definición de recursos en servers.tf. variable "device_name" { default="nvme0n1" }
Ejecutarlo
Casi terminamos. Increíble, ¿no? Es posible que si te adelantaste con los valores predeterminados y no dedicaste mucho tiempo a investigar todos los archivos de configuración, en este momento estés con Terraform recién instalado, algunos archivos copiados y algunas variables configuradas. ¿Y entonces? ¡Entonces ejecútalo!
Pasos
- Inicializa Terraform.
> terraform init
- Aplica las configuraciones que trabajamos tanto para crear.
> terraform apply
Sí. Eso es todo.
Después de varios minutos, deberías ver una salida como la siguiente que indica la URL y la contraseña de administrador para la consola de administración de ECE:
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ******************************** null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => { null_resource.run-ansible (local-exec): "msg": "Adminconsole is reachable at: https://ec2-35-175-235-131.compute-1.amazonaws.com:12443" null_resource.run-ansible (local-exec): } null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ******************************** null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => { null_resource.run-ansible (local-exec): "msg": "Adminconsole password is: yI6ClXYNQ5LGiZlBuOm94s8hGV5ispQS24WVfL5fE9q" null_resource.run-ansible (local-exec): } null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : include_tasks] ************************ null_resource.run-ansible (local-exec): skipping: [ec2-52-70-7-3.compute-1.amazonaws.com] null_resource.run-ansible (local-exec): PLAY RECAP ********************************************************************* null_resource.run-ansible (local-exec): ec2-34-229-205-85.compute-1.amazonaws.com : ok=68 changed=37 unreachable=0 failed=0 skipped=7 rescued=0 ignored=1 null_resource.run-ansible (local-exec): ec2-35-175-235-131.compute-1.amazonaws.com : ok=68 changed=29 unreachable=0 failed=0 skipped=8 rescued=0 ignored=1 null_resource.run-ansible (local-exec): ec2-52-70-7-3.compute-1.amazonaws.com : ok=68 changed=37 unreachable=0 failed=0 skipped=7 rescued=0 ignored=1 null_resource.run-ansible: Creation complete after 16m50s [id=7701810896203834102] Apply complete! Resources: 1 added, 0 changed, 1 destroyed. Outputs: ece-instances = [ [ "ec2-35-175-235-131.compute-1.amazonaws.com", "ec2-34-229-205-85.compute-1.amazonaws.com", "ec2-52-70-7-3.compute-1.amazonaws.com", ], ] installed-ece-url = https://ec2-35-175-235-131.compute-1.amazonaws.com:12443
Te recomendamos abrirlo y probarlo. No tengas miedo. Si haces algo mal, puedes destruir todo y recrearlo de la siguiente manera:
> terraform destroy > terraform apply
Nota: Los certificados usados para TLS son autofirmados, por lo que recibirás una advertencia en el navegador cuando intentes acceder a la consola de administración. Siempre puedes configurar ECE para usar tus propios certificados. Puedes leer más al respecto en los documentos.
Celebrar con manos de jazz
Esperamos que estés de acuerdo con que el nivel de esfuerzo esta vez fue sustancialmente inferior al de la última vez. Logramos evitar por completo la consola de AWS y los aproximadamente 38 pasos que usamos para desplegar, configurar y asegurar todos los recursos (en este método nuevo contamos 10 pasos).
Ahora, avanza y conquista, porque el cloud es pequeño y tú eres un gigante. Juega con ECE, activa clusters, actualízalos y modifica su tamaño. Disfruta de lo sencillo.