Automatize processos com Ansible e otimize seu tempo de trabalho

Automatize processos com Ansible e otimize seu tempo de trabalho

Já parou para pensar como seria incrível executar um comando, e quase que instantaneamente, teríamos um processo que normalmente exigiria alguns bons minutos ou horas para executar, com diversas etapas para realizar? Ou aquele gerenciamento que precisa ser realizado diariamente as mesmas etapas repetitivas, como seria mais fácil um simples click e o ambiente estaria provisionado, com outro click um servidor configurado e disponível para ser colocado em produção, ou quem sabe a implantação ou gerencia de uma aplicação.

Para quem ainda imagina ser um sonho esse tipo de realização, te apresento o Ansible, uma ferramenta de códido aberto para uso em automações, gerenciamentos, provisionamentos e diversos outros processos.

O Ansible possui a característica de não precisar de agentes para gerenciar outras máquinas, que são chamadas de nós, é necessário apenas do python instalado nestas máquinas e uma conexão SSH com uma confiança estabelecida, ou seja, o Ansible usa o protocolo SSH para realizar uma comunicação segura com as máquinas que serão gerenciadas, e a partir desta correspondência, é realizado a execução de módulos, que são scripts escritos em python, que realizam as tarefas que foram definidas, existem centenas de módulos cada um com o objetivo de executar um processo específico.

Estes módulos são definidos em arquivos com formato YAML, e são chamados de playbooks, neste arquivo são definidas as etapas que serão necessárias para concluir o objetivo principal ao escolher utilizar o Ansible, como por exemplo, podemos escrever uma playbook para automatizar um Data Center, de maneira completa, seguindo de maneira direta os mesmos passos que poderiam ser realizados manualmente. Ou pode ser realizado até mesmo uma playbook simples, que realizasse um ping em cada nó apenas para testar a conexão.

Como é a estrutura de gerenciamento do Ansible?

Após ter estabelecido uma conexão segura com os servidores alvo, podemos prosseguir com a estrutura de arquivos, dependendo do projeto realizado será necessário arquivos específicos e mais detalhados.

Vamos exemplificar com um projeto simples, que automatiza a criação de um servidor web com a presença do Apache, possibilitando a visualização de uma página web com informações, para entender como o Ansible funciona, este projeto teve como base a execução em uma máquina Debian 10, para uso em outras distribuições talvez seja necessário realizar pequenas modificações. Observe a seguinte estrutura como exemplo:

1.
2├── ansible.cfg
3├── files
4│   ├── apache.conf.j2
5│   └── index.html.j2
6├── inventory.yml
7└── playbook.yml

Detalhando a estrutura

Temos a playbook, é neste arquivos onde descrevemos tarefas para o Ansible realizar.

O inventory é onde fica armazenado informações sobre os nós, os servidores alvo, de nossas tarefas da playbook.

No diretório files temos dois arquivos com o formato .j2, estes arquivos são templates Jinja2, ou seja são modelos, podemos utilizar modelos de arquivos de configuração como nestes exemplos, para criar um arquivo de configuração durante a automação, juntamente com variáveis, podendo assim customizar facilmente informações de forma automatizada, onde o Ansible verifica as informações passadas nas variáveis e aplica no arquivo do template.

Por fim neste pequeno exemplo temos o ansible.cfg arquivo que suporta informações que realizam o controle e gerenciamento do Ansible.

O que tem ai dentro?

O arquivo ansible.cfg possui o seguinte conteúdo:

ansible.cfg:

1[defaults]
2inventory = inventory.yml
3interpreter_python: /usr/bin/python3

Através dessas informações vemos que está sendo definido configurações padrões, que definem o arquivo inventory.yml como arquivo principal de inventário, e define o caminho do binário do python3 como padrão para uso, o interpretador Python é usado para execução do módulo em destinos remotos ou como um modo de descoberta automática.

O arquivo do inventory.yml encontramos estes detalhes a seguir:

inventory.yml:

1all:
2  hosts:
3    192.168.57.200:
4      ansible_become: true
5      ansible_become_method: sudo
6      ansible_become_user: root
7      ansible_user: root

Para um arquivo de inventário os formatos mais comuns são em INI, que possui um arranjo mais básico, e tem o YAML, o formato utilizado no exemplo acima.

Ao definir all dizemos que todos os nós (hosts), serão afetados pelas execuções, estes nós são definidos dentro do módulo hosts, que no caso deste exemplo possui o IP descrito. Algumas opções de acesso também podem ser definidas neste arquivo de inventário através de variáveis de ambiente do Ansible, segue uma breve explicação:

  • ansible_become – Alterna o uso de escalonamento de privilégios, permitindo que você ‘se torne’ outro usuário após o login.
  • ansible_become_method – O usuário que seu login/usuário remoto ‘se torna’ ao usar o escalonamento de privilégios, a maioria dos sistemas usará ‘root’ quando nenhum usuário for especificado.
  • ansible_become_user – executar operações como este usuário, por padrão é executado como root.
  • ansible_user – define o usuário a ser utilizado.

Dentro da pasta files encontramos dois arquivos de template Jinja2:

apache.conf.j2:

1<VirtualHost *:{{ port_http }}>
2    ServerName {{ hostname }}
3    ServerAlias www.{{ host_alias }}
4    ServerAdmin root@localhost
5    DocumentRoot /var/www/html/{{ hostname }}
6    DirectoryIndex index.html
7    ErrorLog /var/log/apache2/error.log
8    TransferLog /var/log/apache2/access.log
9</VirtualHost>

index.html.j2:

01<!DOCTYPE html>
02<html>
03    <head>
04        <title>Tux the Pinguin!</title>
05    </head>
06    <body>
07        <h1>Welcome to {{ hostname }}!!</h1>
08        <h2>Aventuras no mundo do DevOps!</h2>
09        <h2>Venha conhecer os Cursos da 4Linux e se surpreenda!!</h2>
10<a href="https://4linux.com.br/"><h1>VISITE OS CURSOS 4LINUX!</h1></a>
11    </body>
12</html>

O arquivo apache.conf é um arquivo de configuração padrão do serviço do Apache, o que está sendo realizado neste arquivo apache.conf.j2 é adicionar variáveis que podem ser customizadas, ao invés de utilizar informações fixas.

O arquivo index.html.j2 segue o padrão de utilização em diversos servidores web para armazenar conteúdos para uma página base, porém além das informações normais, neste template também pode conter variáveis para uma fácil transformação durante as execuções automatizadas pelo Ansible.

Por fim temos o arquivo protagonista para este esquema, o playbook.yml, existem diferentes formas de organização para cada função que será executadas, podendo ser colocadas dentro de roles, para uma melhor organização e direcionamento, ou se for um projeto sem muitas funções e tarefas, como é o caso deste exemplo, pode ser adicionado diretamente na playbook:

playbook.yml:

01- hosts: all
02 
03    vars:
04        username: "root"
05        hostname: "tux.4linux.com.br"
06        host_alias: www.{{ hostname }}
07        file_conf: "{{ hostname }}.conf"
08        site_disabled: true
09        port_http: "80"
10 
11    tasks:
12        - name: Instalando Apache2
13            apt:
14                name: apache2
15                update_cache: yes
16                state: latest
17 
18        - name: Criando diretorio para o site
19            file:
20                path: "/var/www/html/{{ hostname }}"
21                state: directory
22                owner: "{{ username }}"
23                group: "{{ username }}"
24                mode: '0755'
25 
26        - name: Criando o arquivo index da página
27            template:
28                src: "files/index.html.j2"
29                dest: "/var/www/html/{{ hostname }}/index.html"
30 
31        - name: Criando arquivo de configuração
32            template:
33                src: "files/apache.conf.j2"
34                dest: "/etc/apache2/sites-available/{{ file_conf }}"
35 
36        - name: Desabilitando o site padrão
37            command:
38                cmd: /usr/sbin/a2dissite 000-default.conf
39            when: site_disabled
40            notify: Reload_Apache
41 
42        - name: Habilitando o site criado
43            command:
44                cmd: /usr/sbin/a2ensite {{ file_conf }}
45            notify: Reload_Apache
46 
47    handlers:
48        - name: Reload_Apache
49            service:
50                name: apache2
51                state: reloaded

Vamos à uma explicação geral sobre o que este arquivo faz, no módulo hosts, temos all, então todos os nós listado no arquivo inventory.yml serão afetados pelas execuções.

Em vars está sendo estabelecido algumas variáveis e seus valores, que foram aplicadas nos arquivos de templates, principalmente para definir os valores necessários para o arquivos de configuração do Apache, como porta que será utilizada para o serviço e qual o hostname que será utilizado.

Tasks é módulo usado para dizer ao Ansible quais as tarefas devem ser executadas, ao utilizar primeiramente o name, é apenas para ficar fácil de visualizar o que está sendo realizado em determinada etapa, seria basicamente um rótulo para a tarefa.

O apt é utilizado para realizar a instalações de pacotes .deb, passando o name dizemos qual pacote é para ser instalado, com o update_cache, é executado algo equivalente ao apt-get update antes de fazer a instalação, e o state é para especificar qual a versão desejada.

Com o módulo file é possível realizar a criação de um arquivo ou diretório, por exemplo, podendo passar o caminho de onde ele será criado nas máquinas, quem será o owner(dono), o group(grupo dono), e qual o mode(permissão) desta nova criação.

Como temos os templates, podemos utilizar o módulo template, que definimos o local de origem(src), onde ele está armazenado em nossa máquina controladora, e qual o caminho de destino(dest) exato que este arquivo será armazenado na máquinas que está sendo gerenciada.

Com o módulo command, é possível executar comandos à serem executados em cada nó, a partir desta execução com o when, é realizado uma verificação, baseado no valor de uma das variáveis definidas, se essa verificação for verdadeira(true), será iniciado um aviso com o notify.

A função handlers, realiza as execuções baseado nos chamados do módulo notify, por exemplo, se o comando para desabilitar o site padrão do Apache, for executado com sucesso e o site for desabilitado, o notify envia essa informação para um bloco do handlers, que irá executar algo, no caso do exemplo é executado o reload no serviço do Apache.

Resumindo…

Esta playbook, irá realizar a execução em todos os hosts, definidos no inventory.yml, seguindo as configurações definidas em ansible.cfg, fará a instalação do Apache em sua última versão, irá criar um diretório específico para o site que será criado, definindo o caminho, dono, grupo e permissões, criará o index.html a partir do template Jinja2, realizará a criação do principal arquivo de configuração do Apache, a partir do template e das variáveis definidas, desabilitará as configurações do site padrão do Apache, e em seguida habilitará o novo site criado, se tudo ocorrer com sucesso fará a reinicialização do serviço do Apache, finalizando para que esteja acessível via web.

Para iniciar esta automação será necessário o seguinte comando, para realizar a execução da playbook, que realizar todas as etapas definidas:

1ansible-playbook playbook.yml

O comando acima deverá ser executado no mesmo local onde o arquivo da playbook se encontra, no caso de ter a seguinte estrutura, acesse a pasta apache, e seguida conseguirá executar(caso não esteja dentro da pasta será necessário passar o caminho absoluto do inventário e da playbook):

1apache
2    ├── ansible.cfg
3    ├── files
4    │   ├── apache.conf.j2
5    │   └── index.html.j2
6    ├── inventory.yml
7    └── playbook.yml

Para realizar a verificação se tudo ocorreu com sucesso as etapas, podemos acessar através de um navegador, o endereço IP do host e teremos a seguinte tela:

Quer saber mais sobre Ansible? Conquistar a possibilidade de se tornar Especialista em Automação com Ansible e potencializar sua carreira?

Conheça o curso ESPECIALISTA EM AUTOMAÇÃO COM ANSIBLE

 

Líder em Treinamento e serviços de Consultoria, Suporte e Implantação para o mundo open source. Conheça nossas soluções:

CURSOSCONSULTORIA

Anterior Como usar o Kaniko para criar imagens de contêineres no GitLab CI/CD
Próxima Gerenciamento eficiente de discos em Linux com LVM: Guia passo a passo

About author

Deborah Melo
Deborah Melo 11 posts

Analista de Infraestrutura | Construtora na 4Linux | LPIC 1 | Graduada em Eng. Elétrica | Apaixonada por tecnologia e ideologias Open Source.

View all posts by this author →

Você pode gostar também

Infraestrutura TI

Prepare-se para a certificação RHCSA-LFCS e destaque-se no mercado de TI

Preparatório RHCSA-LFCS Você está procurando um curso que possa prepará-lo para passar no exame de certificação Redhat ou LFCS? Se sim, então não procure mais, porque o PREPARATÓRIO RHCSA-LFCS é

Infraestrutura TI

Entenda o Middleware: A espinha dorsal da conectividade digital

No cenário tecnológico atual, a conectividade é a espinha dorsal que sustenta nossa vida digital. Imagine um ecossistema complexo de aplicativos, serviços e dispositivos, todos operando em conjunto perfeito. Essa

Destaques

Desbravando o OpenTofu: Parte 02 – Provisionando uma VM na GCP

Olá pessoal, hoje no blog, vamos realizar um deploy na GCP com uma ferramenta em potencial de Infra as Code chamada OpenTofu, um fork do Terraform. Bora lá! Antes de