Utilizando o Ansible – parte 1

ansible-1_abertura

O Ansible é uma ferramenta que automatiza as tarefas de provisionamento de software, gerenciamento de configuração e instalação de aplicações. Foi originalmente desenvolvido por Michael DeHaan e que através da Ansible Inc ofereceu suporte comercial à ferramenta até outubro de 2015 quando esta foi adquirida pela Red Hat. É compatível com diversas distribuições GNU/Linux — não só a “família RH” (CentOS, Fedora, RHEL etc) — e também outros sistemas operacionais.

E nesta primeira parte, a instalação e, claro, alguns testes básicos… 🙂

Alguns conceitos do Ansible

Alguns conceitos básicos sobre o Ansible, que serão detalhados mais tarde mas que é interessante serem introduzidos:

  • Inventário — É uma lista de hosts (nós) podendo ser o nome — www.exemplo.com.br –, o endereço IP — 192.168.0.10 –, uma faixa de nomes ou endereços IP — www[1:9].exemplo.com.br ou 192.168.1.[10:99] — relacionados individualmente ou dentro de um grupo.
  • Módulo — São trechos de código executados remotamente em um nó e que controlam recursos do sistema como serviços, pacotes, arquivos ou até mesmo a execução de comandos. Eles podem ser usados de forma direta ou através dos playbooks.
  • — Ou, se preferir, node. É um host, ou melhor, um host gerenciado pelo Ansible.
  • Playbook — É um arquivo no formato YAML que permite execução de diversos módulos, agrupá-los em tarefas, adicionar e atribuir variáveis.

Ambos são conceitos muito próximos aos existentes em ferramentas de igual função, como o caso do Chef, porém um interessante diferencial do Ansible é o de não necessitar da instalação de clientes nos nós, já que todas as operações são realizadas via SSH (e um pouco de Python).

Criando a máquina virtual

Para facilitar um pouco a vida utilizarei o Vagrant para a criar uma máquina virtual, assim basta clonar o repositório com os arquivos necessários:

$ mkdir -p ~/Vagrant
$ cd ~/Vagrant
$ git clone https://github.com/plainspooky/ansible.git
$ cd ansible

Daí, deixar o Vagrant fazer o resto…

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/xenial64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/xenial64' is up to date...
...
==> default: Mounting shared folders...
 default: /vagrant => /home/giovanni/Vagrant/ansible
==> default: Running provisioner: shell...
 default: Running: /tmp/vagrant-shell20171116-19074-xxkrua
...

Ele criará uma máquina virtual com a versão 16.04 LTS do Ubuntu Linux, atualizará a distribuição e, por último, baixará e instalará¹ o Ansible e suas respectivas dependências utilizando o PIP dentro de um ambiente virtual do Virtualenv.

...
Running virtualenv with interpreter /usr/bin/python2.7
New python executable in /home/ubuntu/ansible_env/bin/python2.7
Also creating executable in /home/ubuntu/ansible_env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.
Collecting ansible
 Downloading ansible-2.4.1.0.tar.gz (6.7MB)
 100% |████████████████████████████████| 6.7MB 93kB/s 
Collecting jinja2 (from ansible)
 Downloading Jinja2-2.10-py2.py3-none-any.whl (126kB)
 100% |████████████████████████████████| 133kB 266kB/s 
...
Successfully built ansible PyYAML MarkupSafe pycparser
Installing collected packages: MarkupSafe, jinja2, PyYAML, six, pycpars
er, cffi, pynacl, enum34, idna, asn1crypto, ipaddress, cryptography, bc
rypt, pyasn1, paramiko, ansible
Successfully installed MarkupSafe-1.0 PyYAML-3.12 ansible-2.4.1.0 asn1c
rypto-0.23.0 bcrypt-3.1.4 cffi-1.11.2 cryptography-2.1.3 enum34-1.1.6 i
dna-2.6 ipaddress-1.0.18 jinja2-2.10 paramiko-2.4.0 pyasn1-0.3.7 pycpar
ser-2.18 pynacl-1.2.0 six-1.11.0
...

Motivo? Via apt-get esta versão do Ubuntu instalaria a série 2.0 enquanto que instalá-la a partir do PIP permite:

  1. Usar a última versão estável, no caso a série 2.4, sem a necessidade de repositórios adicionais no APT e
  2. Instalá-lo de maneira local e acessível a apenas um usuário (para instalá-lo global basta executar o PIP sem chamar o virtualenv).

E com todo o software instalado é só usar vagrant ssh para entrar na máquina virtual.

(¹) Para maiores detalhes sobre a instalação veja o conteúdo arquivo “./ansible/scripts/ansible-install”.

Acessando o ambiente virtual

Para ter acesso ao ambiente configurado com o Ansible faça:

$ source ./ansible_env/bin/activate
(ansible_env) $

Se preferir, você pode acrescentar a seguinte linha ao arquivo “~/.profile” deste usuário:

alias activate="source ~/ansible_env/bin/activate"

E assim usar activate para acessar o ambiente virtual e deactivate (implementado pelo próprio virtualenv) para sair dele.

O inventário preliminar

O Ansible trabalha com um arquivo de inventário que contém uma relação dos hosts (nós) que ele “conhece” e acessa. Por enquanto ele possui um único grupo, o “localhost” contendo apenas o endereço de loopback:

[localhost]
127.0.0.1

Por padrão ele procurará o inventário em “/etc/ansible/hosts” mas ele pode ficar em qualquer lugar, assim deixei o Vagrant encarregado de criá-lo no diretório de trabalho do usuário padrão da máquina virtual.

Testando a ferramenta

Para se certificar que tudo está funcionando corretamente, um teste bem simples…

$ ansible localhost -c local -i ~/hosts -m ping

Mas o que seria isto? Explicando por etapas:

  • localhost → execute em todos os nós que pertencem ao grupo “localhost” que está definido no arquivo de inventário;
  • -c local → o método de conexão, como só há o endereço de loopback posso fazê-lo localmente caso contrário o SSH seria utilizado — as chaves ainda não estão devidamente configuradas;
  • -i ~/hosts → a indicação de qual arquivo de inventário será consultado, no caso o arquivo “~/hosts” criado automaticamente pelo Vagrant e
  • -m ping → o módulo a ser utilizado, neste caso o ping (que tentará se conectar ao nó e ainda verificará se a usabilidade da versão do Python instalada nele).

O resultado será este aqui:

127.0.01 | SUCCESS => {
    "changed": false, 
    "failed": false, 
    "ping": "pong"
}

O primeiro campo é nó seguido do status da operação e, por último um arquivo JSON com o resultado da execução do módulo “ping”, um “pong”… 🙂

Fim desta parte

E paramos aqui para não ficar muito extenso, na próxima parte será a vez de experimentar alguns dos módulos do Ansibile realizando algumas tarefas de manutenção diretamente através dele, como baixar arquivos, executar comandos, gerenciar serviços e instalar pacotes.

Até!

Anúncios

2 comentários sobre “Utilizando o Ansible – parte 1

  1. Pingback: Utilizando o Ansile – parte 2 | giovannireisnunes

  2. Parabéns pelo artigo Giovanni. Muito bem estruturado e com conteúdo bem didático para quem está iniciando.
    Venha fazer parte também da nossa comunidade do ansible-br.org (canal do telegram e outros) e contribuir com seus artigos.

    Curtir

Os comentários estão desativados.