Ansible

O Ansible é uma ferramenta open-source para simplificar e organizar a orquestração e automação de configurações de servidores. Com ele podemos realizar diversas tarefas como atualizar e instalar pacotes, configurar e realizar deploys de aplicações, gerenciar usuários, etc.

Ansible pelos próprios desenvolvedores:

Deploy apps. Manage systems. Crush complexity.
Ansible helps you build a strong foundation for DevOps.
  • É escrito em Python #chupaQuickersHatersDePython
  • Não necessita de agentes instalados nos hosts remotos
  • Utiliza SSH para se conectar
  • Muitos módulos prontos no github e no galaxy.ansible.com

Conceitos importantes

O Ansible é uma ferramenta simples, mas, é necessário conhecer alguns conceitos sobre ele:

  • Inventory: lista de hosts que irão receber os comandos executados pelo server
  • Modules: controlam os recursos do host remoto através de comandos ad-hoc (executam apenas uma tarefa)
  • Tasks: tarefas que serão executada no(s) host(s)
  • Playbook: conjunto de tarefas
  • Roles: é uma forma de carregar determinados tipos de arquivos como env_vars, tasks e handles

Instalação

$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible -y

Talk is cheap. Show me the code.

$ vim hosts
[develop]
127.0.0.1 # trocar pelo ip de um host qualquer
[production]
127.0.0.1 # trocar pelo ip de um host qualquer

Após instalar e configurar o arquivo de hosts vamos testar o ansible:

$ # testa a comunicação entre os servidores
$ ansible all -i hosts -m ping -u <user> -k
$ # echo hello em todos os servidores
$ ansible all -i hosts -a "/bin/echo hello" -u <user> -k
$ # echo hello no grupo de servidor(es) escollhido(s)
$ ansible develop|production -i hosts -a "/bin/echo hello" -u <user> -k

Podemos também escrever um conjunto de tasks e adicioná-las a um playbook:

$ vim env_vars_playbook.yml
- hosts: all
tasks:
- shell: echo $MYSQL_HOST > /home/<user>/env_var
environment:
MYSQL_HOST: "localhost"
- hosts: develop
tasks:
- shell: echo $MYSQL_HOST > /home/<user>/env_var
environment:
MYSQL_HOST: "dev.domain.com"
- hosts: production
tasks:
- shell: echo $MYSQL_HOST > /home/<user>/env_var
environment:
MYSQL_HOST: "production.domain.com"
$ ansible-playbook -i hosts env_vars_playbook.yml -u <user> -k -v

Considerações

No cenário atual da Quick Mobile, onde temos uma arquitetura distribuída, o Ansible é uma ótima ferramenta para automatizar tasks e facilitar o dia-a-dia da equipe :)

O Ansible não requer que clients sejam instalados nos hosts remotos, mas, é necessário um usuário com permissão de root e que o python esteja instalado :/