Aprendendo Ansible
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)
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……