# Ferramenta de automatização Ansible
## Introdução

Ansible é uma simples e poderosa ferramenta de automatização criada para gerenciar múltiplas máquinas de uma vez. Além disso, é uma engine que permite executar Ansible Playbooks.
Uma das principais características que faz o Ansible ser atrativo para uso em relação à automação de serviços é a sua linguagem bastante simples, ao ponto de ser “humanamente legível”, isto é, não precisando ter um notável conhecimento técnico para entender o que está sendo feito. Pelo fato da linguagem ser de fácil entendimento, é possível começar a criar serviços de automação de forma fácil e rápida. E para auxiliar ainda mais o entendimento do que está sendo processado, as tasks são executadas na ordem em que são escritas.
Outras duas características interessantes do Ansible são: Ele é simples de começar a utilizar, pois apenas utiliza SSH para se conectar com os servidores e executar as tasks; e o Ansible utiliza do princípio da idempotência, isto é, seus módulos não executarão uma ação que não mudarão o estado do sistema.
Por fim, o Ansible funciona em cima de uma arquitetura sem a presença de agentes (agentlesss) e não necessita de uma infraestrutura de segurança customizada, fazendo com que o processo de automação seja mais eficiente e mais seguro.

## Linguagem básica do Ansible

O Ansible funciona com suporte de uma linguagem própria baseada em YAML. Sua estrutura é composta por:

### Playbook

Playbooks são a forma pelo qual o Ansible consegue configurar uma política ou passos de um processo de configuração. São feitos para serem fáceis de ler e podem realizar desde deploys de máquinas remotas até delegar ações com diferentes hosts através da interação com servers de monitoramento.

### Play

Um Playbook pode contar várias plays que nada mais são que uma espécie de introdução para as tasks. Isto é, uma play contém várias tasks e define as propriedades que serão utilizadas por elas. Que podem ser nome de hosts, permissões de acesso, portas http. As configurações para as tasks são definidas aqui.

### Task

As tasks são onde o trabalho vai ser efetivamente realizado. Elas contém as definições do que será instalado ou qual arquivo será copiado para o servidor que está sendo configurado, por exemplo. As tasks contém modules, que efetivamente vão realizar o trabalho de automatização.

### Module

As tasks são o local onde o trabalho ocorrerá, mas quem efetivamente o realiza são os modules. São parecidos com os resources do Chef, onde você pode definir diversas atividades, como iniciar um serviço, alterar aquivos com base em um template e outra infinidade de coisas. Por exemplo, há modulos responsáveis por instalar pacotes (apt), adicionar um repositório via ppa (apt_repository), entre outros.

### Handler

São opcionais, sendo estruturas que são ativadas por tasks e são executadas quando são notificadas por uma task. Por exemplo, após a instalação e configuração de um serviço, talvez seja interessante que você o reinicie. Essa é uma das ocasiões em que o uso de um handler é aconselhado.
Uma característica interessante dos handlers, que é fortemente ligada ao princípio da idempotência, é que, caso mais de uma task notifique a execução de um handler, este só será executado uma vez ao fim do bloco de tasks.

## Instalação

É necessário instalar o Ansible em uma máquina apenas, pois é ela que irá gerenciar todas as outras máquinas remotamente, utilizando o protocolo SSH.

### Instalando no Mac OSX e Via Pip
## Utilizando Ansible

Abaixo segue um tutorial que ilustra o funcionamento de Ansible. Para esse tutorial, é necessário ter:
* Vagrant
* Ansible
Com o Ansible instalado, pode-se começar os trabalhos. Uma pasta é criada em /etc/ansible na instalação da ferramenta. Nela, estará contida toda a estrutura de diretórios da ferramenta. Porém, por precaução, ela não será utilizada. Em vez disso, copie seu conteúdo para o local de sua preferência com:
Em outra pasta de sua preferência, rode o seguinte comando:
Isso criará um arquivo de configuração de uma máquina virtual, de nome Vagrantfile. É importante alterá-lo para que fique dessa forma:
Essas configurações são para definir o sistema operacional da máquina e definir um IP estático para ele. Após ter executado o vagrant up, copie a chave pública da sua máquina primária para o arquivo .ssh/authorized_keys da VM.
Isso é necessário pois o Ansible trabalha por default via SSH. Na pasta myproject, altere o arquivo de configuração do Ansible (ansible.cfg) e faça o seguinte:
* Descomente a linha
* E troque por
O que essa diretiva faz é afirmar ao Ansible onde está o arquivo de texto que informará os grupos de máquinas que serão gerenciadas, bem como seus IP's ou algum outro identificador válido. Neste ponto, é necessário comentar que os comandos de execução do Ansible devem ser rodados DENTRO da pasta myproject. Isso porque, caso algum comando seja rodado fora desta pasta, o Ansible tentará executá-lo com base nos arquivos contidos em /etc/ansible. O próximo arquivo a ser alterado é o hosts. Nele, deve-se informar o IP da máquina que será configurada, bem a qual grupo ela pertence e o usuário de acesso. Apague todo seu conteúdo e deixe o arquivo da seguinte forma:
Verifique se o Ansible consegue contactar a VM com o seguinte comando:
Este comando retornará um código JSON indicando sucesso ou falha. Agora, crie uma pasta roles dentro do diretório atual, se ela não existir. Além disso, sob roles crie uma pasta basic. Sob basic, crie uma pasta chamada tasks. Nessa pasta, criaremos nossa primeira “receita” do Ansible. Crie o arquivo main.yml e coloque o seguinte conteúdo:
Essa receita tem duas operações, que consistem em instalar o Vim e o Git na máquina virtual. Isso através do módulo apt, que recebe os argumentos pkg e state. O pkg dirá qual o pacote a ser instalado enquanto que o state diz acerca do estado que este deve se encontrar ao fim da execução. O state installed é o estado padrão para essa operação e poderia ter sido omitido. Agora, deve-se criar o playbook.yml. Esse playbook pode ser criado em qualquer lugar com qualquer nome. Neste caso, crie-o na pasta myproject/, ao lado da pasta roles. Seu conteúdo é o seguinte:
Basicamente, o que esse arquivo diz é que as máquinas em que serão executadas às plays são todas no grupo “gcs”. A diretiva “become: true” diz que para a execução das tasks, o Ansible deve se tornar root. E os roles dizem respeito a qual agrupamento de tasks será executado. No caso deste tutorial, serão as tasks sob a pasta basic. Agora, se tudo estiver correto, rode o comando e veja o mundo brilhar.
PS: É importante notar que arquivos “yml” são identados com espaços e nunca com TABS. Vai salvar seu tempo.