O blog da AWS

Melhor integração do Ansible com o AWS Systems Manager

Por Andres Silva, Arquiteto Especialista Principal de Soluções com a equipe de Ferramentas de Gerenciamento na AWS

 

Introdução

Ansible é uma ferramenta poderosa porque é simples, mas permite lidar com muitas tarefas complicadas com o mínimo de esforço. Há algum tempo, publiquei esta postagem no blog quando lançamos a primeira versão do documento do AWS System Manager (SSM) que habilita o suporte para o Ansible. Naquela época, eu contei a vocês como a forte integração do SSM com outros serviços da AWS, como o IAM e o CloudTrail, não só simplifica o gerenciamento, mas também melhora o nível de segurança de sua infraestrutura. Recebemos bons comentários sobre essa primeira iteração de integração com o Ansible. Mas os clientes queriam mais; integração do GitHub, playbooks complexos, e muito mais. Eles também nos deram bons comentários sobre como melhorar a integração.

Ouvimos comentários e recentemente introduzimos um suporte mais forte para o Ansible com o AWS Systems Manager. A integração é fornecida por um novo documento do Systems Manager chamado AWS-ApplyAnsiblePlayBooks. Esta nova versão incorpora muitos dos recursos que nossos clientes solicitaram. Para obter mais informações sobre todos os novos recursos, consulte a documentação encontrada

 

Como funciona o Ansible

Vamos passar por um exemplo de como usar essa nova funcionalidade poderosa. Esta publicação não se destina a mostrar como o Ansible funciona. Uma das grandes coisas sobre o Ansible é sua excelente documentação que você pode acessar aqui.

Digamos que você deseja configurar uma instância EC2 para executar o Apache e servir uma página personalizada. Com uma instância completamente nova, há algumas coisas que você precisa fazer para que isso aconteça. Vamos analisar as etapas e também ver alguns comandos que você usaria para fazer isso.

Se você precisar instalar o software do servidor web Apache, você pode fazê-lo em uma instância do Amazon Linux usando o seguinte comando:

sudo yum install httpd

Mas se você estiver usando o Ubuntu ou em uma distribuição baseada em Debian, o comando será assim:

sudo apt-get install apache2

Como você pode ver, você precisa saber qual sistema operacional você está executando para decidir qual comando instalar você usará. Ansible simplifica isso e eu vou te mostrar como mais tarde no post.  Depois de instalar o software, você precisa se certificar de que o serviço está sendo executado. Você pode fazer isso com o seguinte comando:

systemctl iniciar httpd  #for Amazon Linuxsystemctl iniciar apache2 #for Ubuntu

A próxima etapa seria copiar a página da Web que você deseja personalizar e servir como a home page do seu servidor web. Normalmente você faria isso com um editor de texto e algum código html. Não entraremos em detalhes, mas para o propósito desta postagem do blog usaremos uma página simples com algumas variáveis para personalização e para mostrar o poder da automação do Ansible.

Como você pode ver várias etapas são necessárias, e se o processo é automatizado para suportar vários sistemas operacionais, então você precisa adicionar algum tratamento lógico para levar em conta as diferentes maneiras de instalar o software (yum vs apt-get)

Como podemos fazer isso usando o Ansible e o novo Documento SSM para executar playbooks do Ansible? Sem entrar em detalhes demais sobre como o Ansible funciona, você pode executar as tarefas necessárias criando um playbook com as seguintes tarefas:

 

- Nome: Reúna dados do EC2
  ec2_metadata_facts:
- name: instalar o Apache em instâncias redhat ou centos
  yum: name=httpd state=present
  when: ansible_os_family == “RedHat”
- name: instalar o apache em instâncias debian ou ubuntu
  apt: name=apache2 state=present
  when: ansible_os_family == “Debian”
- name: template o arquivo de índice para debian
  template: src=index.html.j2 dest=/var/www/html/index.html owner=www-data group=www-data mode=0644
  when: ansible_os_family == “Debian”
- name: modelo do arquivo de índice para Redhat
  template: src=index.html.j2 dest=/var/www/html/index.html owner=apache group=apache =mode apache =0644
  when: ansible_os_family == “RedHat”
- name: ativar o apache na inicialização e iniciar o serviço para redhat ou centos
  service: name=httpd enabled=yes state=started
  when: ansible_os_family == “RedHat” 
- name: ativar o apache na inicialização e iniciar o serviço para debian ou ubuntu
  service: name=apache2 enabled=yes state=started
  when: ansible_os_family == “Debian”

 

As tarefas definidas acima fazem o seguinte:

 

  1. Coletam dados do EC2 e os carrega em uma variável de ambiente que podem ser usada em qualquer lugar na automação.
  2. Há duas tarefas para instalar o Apache, uma para distribuições baseadas em yum e outra para distribuições baseadas em Debian. Isso é executado condicionalmente. O Ansible executará apenas um deles dependendo do sistema operacional que está executando a instância.
  3. Copiará um arquivo template .j2 para a página inicial (index.html). Novamente, dependendo da distribuição Linux apenas um será executado.
  4. Há também duas tarefas para iniciar o serviço. Isso garante que o comando correto seja usado para cada distribuição.

 

Como você pode ver, em termos muito simples, conseguimos definir não apenas todos os comandos necessários para configurar nossa instância como um servidor web, mas também expandimos a automação para ser flexível o suficiente para suportar múltiplas distribuições Linux.

Toda essa automação pode estar contida em um único arquivo de playbook do Ansible. No entanto, como estamos usando um modelo para um arquivo (index.html.j2), precisaríamos incluir esse arquivo como parte da automação também. Para tornar nossa automação mais modular, poderíamos aproveitar o conceito de funções do Ansible. Uma função é uma estrutura para fornecer um conjunto separado de arquivos que podem ser usados para automação. Isso fornece flexibilidade para compartilhar e reutilizar arquivos de automação. Em nosso exemplo, poderíamos quebrar a automação simples que acabamos de projetar e chamá-la de apache. Essa função agora pode ser compartilhada e distribuída para que outros não precisem escrever todo o código necessário para configurar um servidor apache. Aqui estão informações mais interessantes sobre como “papéis” funcionam

 

Juntando tudo podemos ter uma estrutura de arquivos simples que se parece com isso:

Automation

├server.yml

├apache+

   ├tasks

   ├     Main.yml

   ├templates

        ├ index.html.j2

 

O arquivo main.yml tem as tarefas descritas anteriormente. Como você pode ver que o arquivo e o código-fonte do modelo agora estão agrupados em uma estrutura de arquivos para uma função chamada apache. Então, no nível superior, temos um arquivo chamado server.yml que será o principal “playbook”. Esse arquivo simplesmente executará a role. Ela se parece com isto:

---

  - hosts: all

    become: true

    become_method: sudo

    roles:

        - apache

      - Apache

 

Para usar e manter esse conjunto de arquivos de automação, poderíamos usar um sistema de gerenciamento de código-fonte e torná-lo parte de um pipeline de implantação. Para fins de nosso exemplo, digamos que seu sistema compacte os arquivos de automação e os armazene no Amazon S3. Como podemos usar o AWS Systems Manager para implantar automação?

 

Integração com o AWS Systems Manager

Imagine que você tem um conjunto de servidores web que precisam ter o Apache em execução o tempo todo e que devem ser configurados para servir um arquivo. Todos eles têm uma tag chamada role com um valor de “websever” para identificá-los. Seu objetivo é configurar um processo que garanta que essas instâncias sejam configuradas corretamente o tempo todo. Vejamos um exemplo de que você pode usar o novo documento SSM do Ansible para simplificar as operações.

 

  • Faça login no Console da AWS e acesse a página Systems Manager
  • Vá para State Manager
  • No menu à esquerda, clique no botão “Association”
  • Forneça um nome para a associação. Ele pode ser chamado de “webserver”
  • Selecione AWS-AppliansiblePlayBooks na lista de documentos do Systems Manager
  • No campo “source type”, selecione S3
  • No campo “source info”, insira o caminho para onde o arquivo zip está localizado no S3. Você deve inserir o local do arquivo usando a notação JSON no seguinte formato. Por exemplo: {“path”:” https://example-bucket.s3.amazonaws.com/automation.zip”}
  • No campo install dependencies, selecione “true”. Isso instalará o Ansible e todas as suas dependências.
  • No arquivo do playbook, devemos especificar o caminho relativo completo de onde o playbook principal está localizado. Uma vez que comprimimos os arquivos em uma pasta chamada automação, e o arquivo principal é chamado server.yml, especificamos “automation/server.yml” neste campo.
  • No campo “extra variable”, podemos especificar variáveis adicionais que gostaríamos de passar para automação durante a execução. A automação de amostra fornecida acima espera uma variável chamada myregion. Então podemos escrever aqui “myregion=us-east-1”
  • Na seção “target”, selecionaremos a opção “specify tags”. Em seguida, insira a definição de tag para o nosso servidor web. Neste caso, a chave será a função, e o valor será: “webserver”. Isso apontará para o AWS Systems Manager em execução para todas as instâncias que têm uma tag com essa combinação de tags
  • Na programação especificada, selecione a frequência com que você gostaria de executar essa associação.
  • Agora clique em “Create association”

 

Você também pode criar a associação Systems Manager usando o SDK ou o AWS CLI. Se você quiser criar a parceria usando o AWS CLI.Você pode fazê-lo com um comando como este:

aws ssm create-association --name "AWS-ApplyAnsiblePlaybooks" --parameters '{"SourceType":
["S3"],"SourceInfo":["{\"path\": \"https://example
bucket.s3.amazonaws.com/automation.zip\"}"],"InstallDependencies":["True"],"PlaybookFile"
["automation/playbook.yml"],"ExtraVariables":["myregion=us-east-1"],"Check":["False"],"Verbose":["
v"]}' --targets '[{"Key":"tag:role","Values":["webserver"]}]' --max-concurrency "50" --max-errors "0" --
region us-east-1

 

A execução deste comando retornará uma estrutura de “AssociationDescription” no formato JSON, que contém todos os detalhes da nova associação.

É isso. Agora você tem controle total da automação do Ansible usando o AWS Systems Manager. Você pode analisar os resultados da execução de automação no console. Opcionalmente, você também pode habilitar todas as saídas de execução para o S3.

 

Conclusão

Neste post, discutimos alguns recursos básicos do Ansible e analisamos a integração com o AWS Systems Manager. Destacamos como esses recursos do AWS Systems Manager ampliam o poder do Ansible para fornecer controle mais granular e segurança aprimorada, implementando automação de gerenciamento de configuração.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre os autores

Andres Silva é Arquiteto Especialista Principal em Soluções da equipe de ferramentas de gerenciamento da AWS e trabalha com a tecnologia da AWS há mais de 9 anos. Andres trabalha em estreita colaboração com as equipes de serviço para projetar soluções em escala que ajudam os clientes a implantar e dar suporte a infraestruturas de nuvem complexas. Quando não está construindo automação em nuvem, ele gosta de andar de skate com seus dois filhos.

 

 

 

Enrico Bergamo é arquiteto de soluções na AWS focado no segmento Enterprise e é especialista em tecnologias Serverless, e atua auxiliando clientes de diversos segmentos em suas jornadas para a nuvem. Com mais de 10 anos de experiência em Arquitetura e Desenvolvimento de Sistemas, e DevOps. Enrico atuou diretamente com diversas empresas na definição, implementação e implantação de diversas soluções corporativas.