Cómo administrar máquinas virtuales con el módulo EC2 de Ansible AWS

Cuando gestionas las instancias existentes de Amazon Web Service (AWS) EC2, hacer clic en el Panel de Control de Gestión funciona bien. Pero a medida que tu infraestructura crece, gestionar las instancias lleva mucho tiempo y se vuelve complejo. ¿Existe una mejor manera de gestionar las instancias? ¡Sí! El módulo AWS Ansible EC2 puede ayudarte.

En este tutorial, aprenderás cómo el módulo Ansible AWS EC2 te brinda un control poderoso para gestionar las instancias de AWS en un enfoque basado en ejemplos.

¡Sigue leyendo y comienza!

Prerrequisitos

Este tutorial consta de instrucciones paso a paso. Si deseas seguirlo, asegúrate de tener lo siguiente en su lugar:

Asegúrate de que el usuario IAM esté configurado para acceso programático y que le asignes la política existente de AmazonEC2FullAccess.

  • Un archivo de inventario y uno o más hosts están configurados para ejecutar comandos y playbooks de Ansible. La computadora Linux remota se llama mi_servidor, y este tutorial utiliza un grupo de inventario llamado web.
  • Python v3.6 o posterior instalado en tu host controlador de Ansible y en la máquina de nodo remoto. Este tutorial utiliza Python v3.8.10 en una máquina Ubuntu.
  • Módulos de Python boto3 mayores a 1.15.0 y botocore mayores a 1.18.0 deben estar instalados en el host del controlador de Ansible y en la máquina del nodo remoto.

Creación o reinicio de una instancia EC2 con comandos ad hoc

Si planeas crear o reiniciar una única instancia EC2 en una cuenta de AWS, ejecutar comandos ad hoc será suficiente. Los comandos ad hoc son una forma rápida y eficiente de ejecutar un solo comando para crear una instancia EC2 o modificar el tipo de instancia de una instancia EC2 de AWS.

Inicia sesión en tu controlador de Ansible y ejecuta el siguiente comando ansible para conectarte (-m amazon.aws.ec2_instance) al host (web).

El comando pasa un argumento (-a) que indica a Ansible que reinicie la instancia EC2 de AWS con instance_tags=Name=Tag1) en la región us-east-2. Para autenticar la conexión a la cuenta de AWS, añades detalles de aws_access_key y aws_secret_key en el comando ad hoc.

El tutorial realiza todas las acciones en la región us-east-2, pero puedes realizar las mismas acciones en cualquier región de AWS de tu elección.

ansible web -m amazon.aws.ec2 -a " state=restarted instance_tags=Name=Tag1 aws_access_key=AKIAVWOJMI5I2DPXXXX aws_secret_key=F9PaprqnPUn/XXXXXXXXXXXX region=us-east-2"

Una vez que el comando se complete, verás un mensaje CHANGED, como se muestra a continuación, que confirma que Ansible reinició con éxito la instancia EC2 de AWS.

Running an Ad Hoc Command to Restart an Amazon EC2 Instance

Lanzando una instancia EC2 con Ansible Playbook

Acabas de aprender cómo ejecutar un comando ad hoc de Ansible, ¡lo cual es genial para una acción única! Pero quizás necesites realizar múltiples tareas. Si es así, crea un playbook de Ansible que lance una instancia EC2 para ejecutar múltiples tareas.

1. Abre la terminal en tu host controlador de Ansible, luego ejecuta los siguientes comandos para crear un directorio llamado ~/ansible_aws_ec2_module y cambia a ese directorio.

Este directorio contendrá el playbook y todos los archivos de configuración requeridos que usarás para invocar el módulo AWS EC2 de Ansible.

mkdir ~/ansible_aws_ec2_module
cd ~/ansible_aws_ec2_module

2. A continuación, abre tu editor de texto favorito, crea un archivo llamado main.yml en el directorio ~/ansible_aws_ec2_module. Rellena el archivo main.yml con el siguiente contenido del playbook YAML.

El playbook a continuación contiene la tarea que inicia una instancia con una dirección IP pública dentro de una VPC particular en una cuenta de AWS.

Desde este punto en el tutorial en adelante, reemplaza los valores de aws_access_key y aws_secret_key con los tuyos propios.

---
- name: Ansible EC2 instance Launch module demo
# Definición del servidor remoto donde el módulo EC2 de Ansible gestionará los objetos
  hosts: web
  remote_user: ubuntu # Utilizando el usuario remoto como ubuntu
  tasks:
		# Tarea para iniciar una instancia AWS EC2 con una IP pública
    - name: start an instance with a public IP address
      amazon.aws.ec2:
				# Configurando el nombre de la clave 
        key_name: mykey
				# Definir instance_type, image, vpc_subnet_id, assign_public_ip, aws_region
        instance_type: t2.micro
        image: ami-0b9064170e32bde34
        wait: yes
        count: 1
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        assign_public_ip: yes
        aws_region: us-east-2
        aws_access_key: AKIAVWOJMI5XXXXXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQXXXXXXXXXXXXXXXXXX

3. Ejecute el siguiente comando para invocar el playbook (main.yml). El playbook ejecutará las tareas para crear una nueva instancia en la región us-east-2 con un tipo de instancia t2.micro.

ansible-playbook main.yml

A continuación, puede ver que algunas tareas muestran un estado cambiado, lo que indica que Ansible creó la instancia con éxito y modificó el estado de la tarea para ejecutar el comando. En contraste, verá un estado ok ya que algunas tareas no requieren cambios.

Executing a Playbook

4. Ahora, abra su navegador web favorito e inicie sesión en la Consola de Administración de AWS.

5. Finalmente, haga clic en la barra de búsqueda en la parte superior de la consola, busque EC2 y haga clic en el elemento del menú EC2. Al hacerlo, su navegador se redirige a la página de EC2.

Searching the EC2 service in the AWS account

En la página de EC2, verá su instancia recién creada, como se muestra a continuación.

newly created instance

Detener varias instancias de AWS EC2

Quizás algunas instancias de AWS EC2 ya no sirvan para ningún propósito. Si es así, puedes detener o terminar múltiples instancias ejecutando un playbook de Ansible. Especifica los IDs de las instancias y declara valores en una tarea para establecer el comportamiento del módulo AWS EC2 de Ansible al detener las instancias.

1. Crea un playbook de Ansible llamado stop.yml y copia/pega el código a continuación en el playbook.

El playbook siguiente detiene dos instancias (i-0d8c7eb4eb2c643a1 e i-0dbc17a67c0f7577c).

---
- name: Stopping the already Launched EC2 instances using Ansible EC2 Module
# Definiendo el servidor remoto donde el módulo EC2 de Ansible gestionará los objetos
  hosts: web
  gather_facts: false
  # Usando el usuario remoto como ubuntu
  remote_user: ubuntu 
  vars:
    instance_ids:
      - 'i-0d8c7eb4eb2c643a1'
      - 'i-0dbc17a67c0f7577c'
    region: us-east-2
  tasks:
    - name: Stopping the already launched AWS EC2 instances
      amazon.aws.ec2:
        instance_ids: '{{ instance_ids }}'
        region: '{{ region }}'
        state: stopped
        wait: True
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        assign_public_ip: yes
        aws_access_key: AKIAVWOJMI5XXXXXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQXXXXXXXXXXXXXXXXXX

Si prefieres terminar las instancias en lugar de detenerlas, cambia el valor de state a absent.

2. Ahora ejecuta el siguiente comando para ejecutar el playbook (stop.yml), que detendrá las instancias que especificaste en el playbook. ansible-playbook stop.yml

ansible-playbook stop.yml
Executing the Ansible playbook using the ansible-playbook command.

3. Finalmente, navega a tus instancias de AWS en tu navegador web, y verás que dos instancias se detuvieron correctamente, como se muestra a continuación.

Viewing Stopped Instances

Creando una instancia con etiqueta, volumen y monitoreo de Cloud Watch.

Quizás necesites provisionar tu instancia con componentes más avanzados como etiquetas, monitorización con alarmas de CloudWatch, y crear un volumen para fines de almacenamiento. En ese caso, usar el módulo AWS EC2 de Ansible en un playbook resolverá el problema.

Las etiquetas son una excelente manera de organizar los recursos de AWS y realizar cálculos eficientes de costos de recursos en la Consola de Gestión de AWS.

1. Crea un nuevo playbook de Ansible llamado advanced.yml y llénalo con el código a continuación.

El playbook a continuación lanzará una instancia AWS EC2 con (volúmenes—> /dev/sdb, monitoreo y etiquetado de la instancia con Instance1).

---
- name: Adding Tag, Volumes, and cloud Watch Monitoring to an an instance
  hosts: web
  remote_user: ubuntu
  tasks:
    - name: Adding Tag, Volumes, and cloud Watch Monitoring to an an instance
      amazon.aws.ec2:
        instance_type: t2.micro
        image: ami-0b9064170e32bde34
        vpc_subnet_id: subnet-0dc9af4c75ad3e2ee
        region: us-east-2
        aws_access_key: AKIAVWOJMI5I2DXXXX
        aws_secret_key: F9PaprqnPUn/NP8lzQ5lWjXXXXXXXXXXXXXXXx
				# Crear los volúmenes y adjuntarlos a la instancia AWS EC2 de tipo io1
        volumes:
          - device_name: /dev/sdb
            volume_type: io1
            iops: 1000
            volume_size: 100
				# Habilitar la monitorización de CloudWatch
				# de la instancia AWS EC2 que se lanzará
        monitoring: yes
				# Etiquetar la instancia AWS EC2 que se lanzará
        instance_tags:
            Name: Instance1

2. Ahora ejecuta el siguiente comando para ejecutar el playbook (advanced.yml), que lanzará una instancia AWS EC2 con etiquetas, volumen y monitorización de CloudWatch. ansible-playbook advanced.yml

ansible-playbook advanced.yml
Executing the Ansible Playbook to Create an Instance with Tag, Volume, and Cloud Watch Monitoring

3. Navegue hasta la pestaña de Almacenamiento de la instancia que desea verificar en la consola de AWS EC2. Bajo Dispositivos de bloque, haga clic en un ID de volumen de la lista para ver la información detallada de la instancia.

Verifying the volume created in the AWS account for the AWS EC2 instance.

4. Finalmente, haga clic en la pestaña de Etiquetas en la página de información resumida de la instancia. Verá la etiqueta que estableció para la instancia en el playbook (paso uno), como la que se muestra a continuación.

Verifying the tags in the AWS account for the AWS EC2 instance.

Conclusión

En este tutorial, ha aprovechado el módulo de Ansible para AWS EC2 para gestionar instancias de AWS EC2 con un solo comando. También aprendió cómo ajustar instancias de AWS EC2, como reiniciar, terminar, agregar etiquetas, y así sucesivamente.

Ahora que tiene un conocimiento sólido del módulo de Ansible para AWS EC2, ¿está dispuesto a incorporar el módulo de AWS EC2 de Ansible en su rutina de gestión de instancias? ¿Quizás quiera automatizar la tarea añadiendo un trabajo cron?

Source:
https://adamtheautomator.com/ansible-ec2/