Como Gerenciar Máquinas Virtuais Com o Módulo AWS EC2 do Ansible

Quando você gerencia as instâncias existentes do Serviço da Web da Amazon (AWS) EC2, clicar ao redor do Console de Gerenciamento funciona bem. Mas à medida que sua infraestrutura cresce, gerenciar as instâncias leva muito tempo e se torna complexo. Existe uma maneira melhor de gerenciar as instâncias? Sim! O módulo AWS Ansible EC2 pode ajudar.

Neste tutorial, você aprenderá como o módulo AWS EC2 do Ansible lhe dá um controle poderoso para gerenciar instâncias AWS EC2 em uma abordagem orientada por exemplos.

Continue lendo e comece!

Pré-requisitos

Este tutorial é composto por instruções passo a passo. Se você gostaria de seguir junto, certifique-se de ter o seguinte em vigor:

Assegure-se de que o usuário IAM esteja configurado para acesso programático e que você o atribua à política existente AmazonEC2FullAccess.

  • Um arquivo de inventário e um ou mais hosts são configurados para executar comandos e playbooks do Ansible. O computador remoto Linux é chamado de meuserver, e este tutorial utiliza um grupo de inventário chamado web.
  • O Python v3.6 ou posterior deve estar instalado no host do controlador do Ansible e na máquina do nó remoto. Este tutorial utiliza o Python v3.8.10 em uma máquina Ubuntu.
  • Módulos Python boto3 superiores a 1.15.0 e botocore superiores a 1.18.0 devem estar instalados no host do controlador Ansible e na máquina do nó remoto.

Criar ou reiniciar uma instância EC2 com comandos ad hoc

Se você planeja criar ou reiniciar uma única instância EC2 em uma conta AWS, executar comandos ad hoc será suficiente. Comandos ad hoc são uma maneira rápida e eficiente de executar um único comando para criar uma instância EC2 ou modificar o tipo de instância de uma instância EC2 da AWS.

Acesse seu controlador Ansible e execute o comando ansible abaixo para se conectar (-m amazon.aws.ec2_instance) ao host (web).

O comando passa um argumento (-a) que diz ao Ansible para reiniciar a instância EC2 da AWS com instance_tags=Name=Tag1) na região us-east-2. Para autenticar a conexão à conta AWS, você adiciona os detalhes aws_access_key e aws_secret_key no comando ad hoc.

O tutorial realiza todas as ações na região us-east-2, mas você pode realizar as mesmas ações em qualquer região da AWS de sua escolha.

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"

Depois que o comando for concluído, você verá uma mensagem ALTERADO, como mostrado abaixo, confirmando que o Ansible reiniciou com sucesso a instância EC2 da AWS.

Running an Ad Hoc Command to Restart an Amazon EC2 Instance

Lançando uma Instância EC2 com um Playbook do Ansible

Você acabou de aprender como executar um comando ad hoc do Ansible, o que é ótimo para uma ação única! Mas talvez você precise realizar várias tarefas. Se for o caso, crie um playbook do Ansible que lançará uma instância EC2 para executar várias tarefas.

1. Abra o terminal no seu host controlador do Ansible e execute os seguintes comandos para criar um diretório chamado ~/ansible_aws_ec2_module e mudar para esse diretório.

Este diretório conterá o playbook e todos os arquivos de configuração necessários que você usará para invocar o módulo EC2 do Ansible.

mkdir ~/ansible_aws_ec2_module
cd ~/ansible_aws_ec2_module

2. Em seguida, abra seu editor de texto favorito, crie um arquivo chamado main.yml no diretório ~/ansible_aws_ec2_module. Preencha o arquivo main.yml com o seguinte conteúdo de playbook YAML.

O playbook abaixo contém a tarefa que inicia uma instância com um endereço IP público dentro de uma VPC específica em uma conta da AWS.

A partir deste ponto ao longo do tutorial, substitua os valores de aws_access_key e aws_secret_key pelos seus próprios.

---
- name: Ansible EC2 instance Launch module demo
# Definindo o servidor remoto onde o módulo Ansible EC2 gerenciará os objetos
  hosts: web
  remote_user: ubuntu # Usando usuário remoto como ubuntu
  tasks:
		# Tarefa para iniciar uma instância AWS EC2 com um IP público
    - name: start an instance with a public IP address
      amazon.aws.ec2:
				# Configurando o nome da chave
        key_name: mykey
				# Definir o tipo de instância, imagem, 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. Execute o comando abaixo para invocar o playbook (main.yml). O playbook então executa as tarefas para criar uma nova instância na região us-east-2 com o tipo de instância como t2.micro.

ansible-playbook main.yml

Abaixo, você pode ver que algumas tarefas mostram um status changed, o que indica que o Ansible criou a instância com sucesso e modificou o estado da tarefa para executar o comando. Em contraste, você vê um status ok, já que algumas tarefas não requerem mudanças.

Executing a Playbook

4. Agora, abra seu navegador da web favorito e faça login no Console de Gerenciamento da AWS.

5. Por fim, clique na barra de pesquisa no topo do console, procure por EC2 e clique no item de menu EC2. Isso redirecionará seu navegador para a página do EC2.

Searching the EC2 service in the AWS account

Na página do EC2, você verá sua instância recém-criada, como mostrado abaixo.

newly created instance

Parando Múltiplas Instâncias AWS EC2

Talvez algumas instâncias AWS EC2 não sirvam mais para nenhum propósito. Se for o caso, você pode parar ou encerrar várias instâncias executando um playbook Ansible. Especifique os IDs das instâncias e declare valores em uma tarefa para definir o comportamento do módulo AWS EC2 do Ansible ao parar as instâncias.

1. Crie um playbook Ansible chamado stop.yml e copie/cole o código abaixo no playbook.

O playbook abaixo para duas instâncias (i-0d8c7eb4eb2c643a1 e i-0dbc17a67c0f7577c).

---
- name: Stopping the already Launched EC2 instances using Ansible EC2 Module
# Definindo o servidor remoto onde o módulo AWS EC2 do Ansible gerenciará os objetos
  hosts: web
  gather_facts: false
  # Usando o usuário 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

Se preferir encerrar as instâncias em vez de pará-las, altere o valor de state para absent.

2. Agora execute o comando abaixo para executar o playbook (stop.yml), que interromperá as instâncias especificadas no playbook. ansible-playbook stop.yml

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

3. Por fim, vá para suas instâncias AWS em seu navegador da web, e você verá que duas instâncias foram interrompidas com sucesso, conforme mostrado abaixo.

Viewing Stopped Instances

Criando uma instância com Tag, Volume e Monitoramento Cloud Watch

Talvez seja necessário provisionar sua instância com componentes mais avançados, como marcação, monitoramento com alarmes do CloudWatch, e criar um volume para armazenamento. Nesse caso, usar o módulo AWS EC2 do Ansible em um playbook resolverá o problema.

As tags são uma excelente maneira de organizar os recursos da AWS e fazer cálculos de custo eficientes dos recursos no Console de Gerenciamento da AWS.

1. Crie um novo playbook do Ansible chamado advanced.yml e preencha o playbook com o código abaixo.

O playbook abaixo lançará uma instância AWS EC2 com (volumes—> /dev/sdb, monitoramento e marcará a instância com 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
				# Criando os volumes e anexando à instância AWS EC2 do tipo io1
        volumes:
          - device_name: /dev/sdb
            volume_type: io1
            iops: 1000
            volume_size: 100
				# Habilitando o monitoramento do CloudWatch
				# da instância AWS EC2 que será lançada
        monitoring: yes
				# Marcando a instância AWS EC2 que será lançada
        instance_tags:
            Name: Instance1

2. Agora execute o comando abaixo para executar o playbook (advanced.yml), que lançará uma instância AWS EC2 com marca, volume e monitoramento do 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 até a guia de Armazenamento da instância que deseja verificar no console AWS EC2. Em Dispositivos de Bloqueio, clique em um ID do Volume na lista para visualizar as informações detalhadas da instância.

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

4. Por fim, clique na guia Tags na página de informações resumidas da instância. Você verá a tag que definiu para a instância no playbook (passo um), como a abaixo.

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

Conclusão

Neste tutorial, você aproveitou o módulo AWS EC2 do Ansible para gerenciar instâncias AWS EC2 com um único comando. Você também aprendeu como ajustar instâncias AWS EC2, como reiniciar, encerrar, adicionar tags, entre outros.

Agora que você possui um conhecimento sólido do módulo AWS EC2 do Ansible, está disposto a incorporar o módulo Ansible EC2 AWS em sua rotina de gerenciamento de instâncias? Talvez queira automatizar a tarefa adicionando um cron job?

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