Introdução ao Ansible
E ai pessoal, tudo bem? Hoje volto aqui para falar de uma tecnologia que conheci a pouco tempo, mas que me fascinou. o Ansible.
Mas o que é Ansible?
Ansible é uma ferramenta de automação, gerenciamento e configuração de servidores de propriedade da Red Hat, através dele podemos definir e executar várias funções, configurar um ou mais servidores e por neles, aplicações específicas. Um exemplo seria colocar uma aplicação Spring Boot rodar em alguma máquina virtual(VM), ou até mesmo em um serviço cloud (AWS, Azure e afins)
Gostaria de deixar claro que este artigo é uma apresentação do Ansible, então não iremos nos aprofundar, mas sim viajar pela estrutura dessa ferramenta.
Vamos falar um pouco sobre a estrutura do Ansible…
Host de controle é onde configuramos o Ansible. É de lá que partem todas as ações dele. Para que o Ansible consiga atuar em algum servidor esse servidor precisa estar definido em seu inventory…
Inventory
É o arquivo que define os servidores ou grupos de servidores que o Ansible consegue acessar. Vamos partir da ideia que temos 3 servidores para gerenciar com os seguintes IPs:
- 192.100.10.1
- 192.100.10.2
- 192.100.10.3
Outro ponto importante em nosso contexto é que teremos ações que se aplicarão aos 3 servidores e algumas que vão ser aplicadas somente aos servidores 192.100.10.2 e 192.100.10.3.
Então podemos fazer o seguinte, criar um arquivo com o nome de inventory e na sequência inserir nele as seguintes linhas:
Os [ ] definem que temos um grupo abaixo deles… no nosso contexto precisaria de 2 grupos e foi o que fizemos. O nome do grupo é bem relativo e vai depender de cada projeto, aqui quis deixar mais claro o motivo dessa divisão, que em nosso caso seria a separação da publicação de aplicações java e react.
Também poderíamos criar um grupo que teria como filhos esses dois grupos já criados:
E para definir isso usamos a sintaxe [nome-do-grupo:children] e abaixo dele os grupos que gostaria de adicionar.
Outro ponto bacana na sintaxe é que quando você tem padrões de hosts você pode reduzir a escrita, da seguinte forma, adicionando 192.100.10[1:3]
Então teríamos um arquivo assim no final:
E como são executados os comandos do Ansible?
Utilizando os módulos.
Modules
Os módulos do Ansible são como bibliotecas que estão a nossa disposição para executar as mais variadas tarefas, vamos pegar um módulo aqui como exemplo, o copy. Imagine que por algum motivo precise pôr nos servidores um arquivo com configurações específicas, ou somente mesmo um documento de texto simples.
A sintaxe é:
Existem módulos para as mais variadas situações, abaixo um link da documentação com um índice deles agrupados por categoria.
https://docs.ansible.com/ansible/2.9/modules/modules_by_category.html
Beleza, então é só fazer várias chamas por terminal e estarei utilizando o Ansible em meus projetos, né?
Não.
O que acabamos de fazer foi utilizar um comando chamado ad-hoc, e não é aconselhável usar em um ambiente profissional. O Ansible preza pela idempotência, que significa manter todos seus hosts em igualdade para que nenhuma incompatibilidade possa vir a causar problemas em seu trabalho e o resultado seja o mesmo em todos os ambientes.
Ad-Hoc, é um comando executado direto em terminal que executam uma única ação que não necessita de repetições.
E qual é a forma correta então?
A resposta é…
Playbooks
Eles são os arquivos que usamos para definir todas as ações tomadas pelo Ansible em nossos servidores, são arquivos do tipo yaml. Nesses arquivos definimos as tasks que queremos que sejam executadas e os servidores que receberão essas alterações.
Para começar, vamos fazer a mesma alteração do copy que fizemos acima, porem agora no padrão de um playbook, a sintaxe fica assim:
Podemos também ter variáveis dentro de um playbook, definidas no atributo vars:
Podemos importar essas variáveis de um arquivo externo que pode conter várias variáveis:
O arquivo:
Podemos definir os arquivos que contem as variáveis através do atributo. var_files:
Condicionais também podem ser aplicadas, imagine que quando o nome do arquivo for “documento” a cópia não deve acontecer, então vamos utilizar o when e definir essa condição.
Viram como o playbook é muito mais robusto comparado a um comando ad-hoc?
E tudo isso já vem configurado?
Para definir configurações no Ansible você precisa ajustar o arquivo ansible.cfg.
O ansible.cfg
É onde é definida todas as configurações do Ansible e podem ser alteradas conforme a necessidade de cada projeto. Um exemplo seria a definição do caminho do arquivo inventory, abaixo segue um link com a documentação de configuração.
https://docs.ansible.com/ansible/latest/reference_appendices/config.html
Python
A linguagem de programação padrão que o Ansible usa é o Python, então um dos requisitos é o ter instalado na máquina.
Estrutura de pastas
A prática recomendada para o gerenciamento de arquivos e variáveis é a seguinte:
Arquivos na raiz:
- ansible.cfg
- inventory
- playbooks
group_vars: Consiste em vários arquivos de variáveis correspondentes ao grupo de hosts aos quais se aplicam.
host_vars: Consiste em vários arquivos de variáveis com nomes que correspondem aos nomes dos hosts gerenciados aos quais se aplicam.
Numa próxima falaremos do processo de deploy em cloud, aguarde.
Bom pessoal, isso é uma pequena introdução ao Ansible e sua estrutura, espero que tenham gostado… Abaixo segue o link da documentação.
Até a próxima.