>> Apresentação e configurações

Olá ChurrOpeiros!

Ansible é uma ferramenta de automação de TI. Com o Ansible é possível configurar sistemas, implantar softwares, e orquestrar tarefas na área de infraestrutura de TI.

Neste post vou apresentar o Ansible trabalhando no modo “ad hoc”, resumidamente vamos executar os comandos diretamente da linha de comando sem Playbooks

Embora seja algo básico, já me deparei com muitas pessoas esbarrando nessas situações, por isso vou dividir o post AD HOC em duas partes.

Parte 01 – Como instalar, como utilizar em uma máquina com sudo, instalar a dependência do Python, chave ssh, e etc.

Parte 02 – Vamos explorar um pouco mais os módulos existentes no Ansible!

Let’s go!

>> Instalação

Ubuntu via APT

As compilações do Ubuntu estão disponíveis em um PPA, para configurar o PPA na sua máquina e instalar o ansible, execute esses comandos:

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

CentOS/ RHEL e Febora via Yum

Os usuários do Fedora podem instalar o Ansible diretamente, no entanto, se você estiver usando o RHEL ou o CentOS e ainda não o fizer, configure o EPEL# install the epel-release RPM if needed on CentOS, RHEL, or Scientific Linux

~# yum install -y epel-release && yum install -y ansible

Essencialmente não tem muito segredo, para demais dúvidas na instalação ou instalação em um sistema operacional diferente, por favor consulte a documentação oficial

Documentação de instalação do Ansible

>> AD HOC e Playbook

No Ansible temos basicamente 2 formas de executar as nossas “receitas” nas máquinas remotas: playbook e ad hoc.

Playbooks: Como são chamados os arquivos de gerenciamento de configuração. Nele é possível escrever os perfis de tarefas que serão executadas. Possui um padrão chamado YAML que torna simples a escrita e leitura dos playbooks.

ADHOC: São comandos executados diretamente na linha de comando com a instrução que deseja, vamos supor que você precise dar um start/stop/restart em um serviço em uma série de servidores, ou você precise saber quais servidores estão com a configuração X, ou ver espaço em disco, memória, ou talvez você queira instalar um pacote, enfim são N possibilidades, mais você só quer fazer isso em um dado momento e não necessariamente guardar essa configuração em playbook.

Este é um bom início para entender os conceitos básicos do que Ansible pode fazer antes de aprender a escrever os playbooks.

http://docs.ansible.com/ansible/intro_adhoc.html

>> Modulo ‘ping’ e Módulo ‘raw’

Situação:

Acabamos de instalar uma máquina Ubuntu Server 17.04, foram instalados somente os pacotes base + o OpenSSH Server.

Arquivo de inventário
Primeira coisa, precisamos ter conexão ssh com as máquinas gerenciadas.

Precisamos do arquivo de inventário do Ansible para sabermos quem são os hosts que vamos executar as ações

Estamos assumindo que estamos utilizando o arquivo padrão: /etc/ansible/hosts , no caso desse artigo estou utilizando somente 1 host como alvo das execuções, com isso adicionei somente 1 IP que é referente ao meu servidor remoto, nesse arquivo você deve declarar todos os hosts que você deseja orquestrar com o Ansible.

cat /etc/ansible/hosts
192.168.250.101

Para maiores informações:
http://docs.ansible.com/ansible/intro_inventory.html

Compreendendo e executando
Foi criado um usuário com senha, e esse usuário pode virar root e executar tarefas como root porém sempre precisa da senha também, ou seja, para começarmos a brincar nessa máquina precisaremos digitar a senha duas vezes.

Antes de executar já vamos entender os parâmetros que vamos utilizar:

-u churrops    ---------> Usuário utilizar para conectar
--ask-pass     ---------> Solicita a senha do usuário
-b (--become)  ---------> Roda como sudo,  default user: root
-K (--ask-become-pass)--> Senha para virar sudo

Sabendo disso vamos executar:
Obs.: no comando abaixo, estamos passando o host alvo, lembrando que o mesmo tem que estar dentro do arquivos hosts.

~# ansible 192.168.250.101 -i /etc/ansible/hosts -m ping -u churrops --ask-pass -b -K

SSH password:
SUDO password[defaults to SSH password]:

Ao executar o comando acima, nos deparamos com o seguinte erro:

192.168.250.101 | FAILED! => {
    "changed": false,
    "failed": true,
    "module_stderr": "",
    "module_stdout": "/bin/sh: 1: /usr/bin/python: not found\r\n",
    "msg": "MODULE FAILURE",
    "rc": 0
}

Como vemos o Python não está instalado, o Python é um pré-requisito para você fazer as tarefas com o Ansible.

O Ansible possui uma lista extremamente grande de módulos que ajudam a extrair o melhor da orquestração na hora de falar com os hosts, os módulos facilitam demais na hora da criação dos playbooks e execução das tarefas, além de serem na maioria das vezes idempotentes.

Modulo raw

O Ansible possui um módulo chamado “raw”, é recomendado utilizar esse módulo somente em 2 ocasiões:

  • O primeiro caso é basicamente é instalar o python-simplejson quando não temos Python no host a ser gerenciado.
  • O segundo caso é recomendado para qualquer host que de fato não possua nenhuma instalação de Python como Switches, Roteadores.

http://docs.ansible.com/ansible/raw_module.html

O nosso caso é a primeira opção, isso mesmo, vamos utilizar o Ansible para instalar o pré-requisito do próprio Ansible! ….

~# ansible 192.168.250.101 -i /etc/ansible/hosts -m 'raw apt-get -y install python-simplejson' -u churrops --ask-pass -b -K

SSH password:
SUDO password[defaults to SSH password]:

192.168.250.101 | SUCCESS | rc=0 >>
Lendo listas de pacotes... Pronto
Construindo árvore de dependências
Lendo informação de estado... Pronto
...
...
...

Agora vamos executar novamente o módulo do ping e vamos ver o que acontece

~# ansible 192.168.250.101 -i /etc/ansible/hosts -m ping -u churrops --ask-pass -b -K
SSH password:
SUDO password[defaults to SSH password]:

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

Sensacional!!! …O Python já está instalado e podemos prosseguir!

>> Criando a relação de confiança

Vamos criar uma chave ssh em nossa máquina, transferir para a máquina remota e em seguida validar que estamos conectando sem senha quando informamos a chave

~# ssh-keygen -t rsa -f ~/.ssh/ansible-churrops_rsa -C "ansible@churrops" -q -N ""

~# ssh-copy-id -i ~/.ssh/ansible-churrops_rsa.pub churrops@192.168.250.101

~# ssh -i ~/.ssh/ansible-churrops_rsa churrops@192.168.250.101

>> E agora como uso o Ansible nesse cenário?

Adicionei o parâmetro “–private-key” informando o path da minha chave e removi o parâmetro “–ask-pass” já melhorou, só precisamos digitar a senha 1 vez!

~# ansible 192.168.250.101 -i /etc/ansible/hosts --private-key=~/.ssh/ansible-churrops_rsa -m ping -u churrops -b -K
SUDO password:
192.168.250.101 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Nesse exemplo passei o minha chave como um parâmetro na minha linha de comando, mais como a maioria dos parâmetros podem ser adicionados no arquivo de conf que por padrão é o: /etc/ansible/ansible.cfg

private_key_file=/path/to/file.pem

>> Tá legal, mais e se eu quiser usar sem senha de verdade?

Vamos manipular o arquivo “/etc/sudoers” e para isso vamos utilizar o módulo “lineinfile” que escreve no arquivo de forma idempotente

~# ansible 192.168.250.101 -i /etc/ansible/hosts --private-key=~/.ssh/ansible-churrops_rsa -m "lineinfile dest=/etc/sudoers state=present regexp='^%sudo' line='%sudo ALL=(ALL) NOPASSWD: ALL'" -u churrops -b -K

SUDO password:
192.168.250.101 | SUCCESS => {
    "backup": "",
    "changed": true,
    "msg": "line replaced"
}

BINGO! …agora podemos realizar a conexão sem senha, basta informar o usuário e o parâmetro “-b” já indica que é pra ser executado com sudo!

~# ansible 192.168.250.101 -i /etc/ansible/hosts --private-key=~/.ssh/ansible-churrops_rsa -m ping -u churrops -b

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

Validando a alteração no arquivo /etc/sudoers

~# ansible 192.168.250.101 -i /etc/ansible/hosts --private-key=~/.ssh/ansible-churrops_rsa -m 'shell grep -v ^#  /etc/sudoers |grep sudo' -u churrops -b

192.168.250.101 | SUCCESS | rc=0 >>
%sudo ALL=(ALL) NOPASSWD: ALL

Se pra você retornou uma saída semelhante, show, porque esse arquivo somente o root pode abrir, isso significa que o seu sudo funcionou!!!

>> Conclusão

Sem mais delongas para esse Post, acho válido e extremamente importante sempre ler as documentações oficiais, esse Post foi bem simples como disse no início, mais alguns dos itens passados por ele é a dúvida de MUITA gente que está começando com Ansible, com isso espero ter ajudado!

Vem por aí a segunda parte desse Post AD HOC, e lá vamos explorar um mais os módulos, e dessa forma você já irá se familiarizando com eles e quando for criar o seu Playbook tudo fluirá mais facilmente.

Abraços!

>> Referências para estudo

Tem o Blog do meu parça Tadeu Bernacchi que tem se dedicado bastante

http://tadeubernacchi.com.br/blog/post/ansible-primeiros-passos-e-exemplos

E tem vários temas de Ansible no Blog do Evandro Couto que na minha opinião é um dos melhores de DevOps que já vi (se não for o melhor…hehe)!

http://tutoriaisgnulinux.com/category/ansible/