Aprendendo Ansible

Lucas Pontes
4 min readAug 22, 2020

--

Não tão direto ao código como eu gostaria.

Para quem server o Ansible?

Administradores de sistemas e ambientes.

Para que serve?

Orquestração de tarefas computacionais ( Instalação de pacote remoto, atualização, restauração de ambiente … ).

Okay, o que eu ganho com isso?

Execute comando em diversos computadores, sem a necessidade de se logar em cada um deles.

Execute o mesmo script em várias máquinas ao mesmo tempo.

Execute tarefas em uma sequência pré-estabelecida, defina as ações de rollback.

Okay, o que eu perco com isso?

Sim, sempre existe algo a perder. O seu ambiente precisa ser seguro, pois se você perder o gerenciamento central, um grande estrago pode ser feito no seu ambiente.

Principais motivos para usar:

  • Open Source
  • Comece pequeno e escale conforme a sua necessidade
  • Muita documentação na internet

O que eu preciso saber antes de aprender sobre o Ansible:

  • Linux ( Comandos de terminal , https://www.guiafoca.org )
  • Algum editor de texto do seu gosto
  • Alguma familiaridade com scripts ( Bash e Python são boas opções)
  • Yaml , é mais uma forma de serializar informação e é usado para defnir rotinas de deploy no Docker e Kubernetes

Instalação:

Pré-requisitos para a instalação:

Python 2.6 ou superior + algumas poucas bibliotecas.

Não é necessário a instalação de agentes nos hosts que serão gerenciados.

Um canal de comunicação SSH entre o controle central ( Ansible Control ) e os demais hosts. Todo o dado é transportado de forma segura, através do protocolo SSH.

A instalação deve ser feita diretamente em uma estação Linux, e nesse exemplo eu usei a distribuição Ubuntu.

Vamos aos comando…:

Instalando o pacote do Ansible ( somente no host de controle), utilizando o apt:

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo apt-add-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible
#Esse pacote é necessário para conexões ssh entre o control e os hosts
$ sudo apt install sshpass

Verifique a versão que foi instalada:

$ ansible --version
>> ansible 2.5.1
>> Config file: /etc/ansible/ansible.cfg
...

Configuração do ambiente:

Inventórios ( Inventory ): Define uma coleção de hosts que serão gerenciados pelo Ansible Control. Esta é a configuração mais importante, pois define todos os alvos que precisam estar acessíveis através do protocolo SSH.

$ sudo vi /etc/ansible/hosts

Dentro do arquivo /etc/ansible/hosts:

Para conexões com ssh, veja mais na documentação oficial: https://docs.ansible.com/ansible/latest/user_guide/connection_details.html

#Aqui, já existe a necessidade de se saber o mínimo de YAML
#/etc/ansible/hosts
#Configuração simples
host1.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@
host2.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@host3.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@#Configuração em Grupos
[it]
host4.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@
host5.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@#Em caso do SSH estar rodando em uma porta diferente da 22
host6.dominio.com:2222 ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@
[finance]
host7.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@
host8.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@host9.dominio.com ansible_connection=ssh anible_user=admin ansible_pass=MyPassHere2020@#Configuração em subgrupos
[Campinas:children]
it
[SP:children]
finance
[all:vars]
ansible_connection=local

Faça uma connexão ssh com todo os novos hosts, para guardar a chave ssh em known_hosts

Para testar a conexão com todos os seus hosts, execute os seguinte comando:

ansible all -i /etc/ansible/hosts -m ping

Tasks: São as ações que serão executadas nos hosts ( simples assim ). Aqui mais uma vez, será necessário conhecer um pouco de YAML.

  • Toda task gera um retorno, que pode ser usado para definir qual será a próxima task a ser executada, ou evitar que a mesma task seja executa repetidamente, sem necessidade, como por exemplo, a criação de uma pasta para armazenar os backups do dia.
  • Os trechos de códigos executados pela task, são chamados modules
#Na primeira execução do dia, a pasta não existe
$ mkdir /backup_folder/$(date +%M-%d)
#Na segunda execução do dia a pasta já existe e você receberá um código de erro
$ mkdir /backup_folder/$(date +%M-%d)
Ansible Task diagram with modulde code and return data

Executando seu primeiro conjunto de tasks:

Plays: É a forma de conectar uma task com um host

Playbooks: É uma coleção de plays

#Criando o seu primeiro playbook bem sucedido
$ sudo vi /etc/ansible/demoplays.yaml

CDentro do arquivo /etc/ansible/demoplays.yaml:

(texto validado com o editor https://onlineyamltools.com/edit-yaml )

---
- name: "Esste é o nome do meu playbook 1"
hosts: it
taks:
- name: Demo1
debug:
msg: "Mensgem 1"
- name: Demo2
debug:
msg: "Mensagem 2"
- name: "Esste é o nome do meu playbook 2"
hosts: finance
taks:
- name: Demo3
debug:
msg: "Mensgem 3"
- name: Demo4
debug:
msg: "Mensagem 4"

Execute o seu playbook com apenas um comando no terminal:

#Executando o seu playbook passando como argumento o endereço do arquivo de host e o arquivo do playbook
# Primeiro argumento: -i [arquivo de host]
# Segundo argumento: [arquivo do playbook]
$ ansible-playbook -i /etc/ansible/hosts /etc/ansible/demoplays.yaml

A saída do comando mostrará os detalhes de execução das tasks, todas bem sucedidas.

Nota: Aqui está algo incrível que eu demorei para entender, mas não necessário digitar o login e senha dos hosts em nenhum lugar. O que eu fiz foi logar com o SSH client em todos os hosts.

Nota2: Descobri no dia seguinte como configurar a senha no arquivo de hosts via Stack Overflow

Você pode simular uma falha de execução, alterando o módulo debug para o módulo fail:

---
- name: "Esste é o nome do meu playbook 1"
hosts: it
taks:
- name: Demo1
debug:
msg: "Mensgem 1"
- name: Demo2
debug:
msg: "Mensagem 2"
- name: "Esste é o nome do meu playbook 2"
hosts: finance
taks:
- name: Demo3
fail:
msg: "Mensgem 3"
- name: Demo4
debug:
msg: "Mensagem 4"

A saída do comando mostrará os detalhes de execução das tasks, com destaque para o host que não teve a execução completada com sucesso.

Continua……

--

--

Lucas Pontes

Pai orgulhoso da Valentina. Desenvolvedor de Software e TI. Trabalhando na Samsung. Desenvolvimento de sistemas freelancer em Java e PHP. Arduino fan