Ferramenta de automatização Ansible

Fonte: Wikiversidade

Introdução[editar | editar código-fonte]

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[editar | editar código-fonte]

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

Playbook[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

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[editar | editar código-fonte]

É 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.

Via Yum[editar | editar código-fonte]

sudo yum install ansible

Via Apt (Ubuntu)[editar | editar código-fonte]

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

Via Apt (Debian)[editar | editar código-fonte]

deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 93C4A3FD7BB9C367
sudo apt-get update
sudo apt-get install ansible

Instalando no Mac OSX e Via Pip[editar | editar código-fonte]

sudo easy_install pip
sudo pip install ansible

Utilizando Ansible[editar | editar código-fonte]

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:

cp -R /etc/ansible myproject/

Em outra pasta de sua preferência, rode o seguinte comando:

vagrant init

Isso criará um arquivo de configuração de uma máquina virtual, de nome Vagrantfile. É importante alterá-lo para que fique dessa forma:

config.vm.box = "debian/jessie64"
config.vm.network "private_network", ip: "192.168.50.4"

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.

echo "exibir a chave pública"
cat ~/.ssh/id_rsa.pub

echo "entrar na vm"
vagrant ssh

echo "copiar a chave para o arquivo ./.ssh/authorized_keys"

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
#inventory      = /etc/ansible/hosts
  • E troque por
inventory = hosts

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:

[gcs]
192.168.50.4 ansible_ssh_user=vagrant

Verifique se o Ansible consegue contactar a VM com o seguinte comando:

ansible gcs -m ping -vvv

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:

- name: "Installing VIM"
  apt: pkg=vim state=installed

- name: "Installing GIT"
  apt: pkg=git state=installed

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:

---
- hosts: gcs
  become: true
  roles:
  - basic

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.

ansible-playbook playbook.yml

PS: É importante notar que arquivos “yml” são identados com espaços e nunca com TABS. Vai salvar seu tempo.

Referências[editar | editar código-fonte]