>> 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://www.tadeubernacchi.com.br/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)!
2 Pingback