Sei sulla pagina 1di 8

INTRODU��O AO ANSIBLE

Autor: Vamberto Rocha JR


Contato: vambertojr@gmail.com
-v1.0-
Introdu��o ao Ansible
Com o avan�o e a populariza��o das tecnologias de virtualiza��o e
cloud, os administradores de sistemas gerenciam muito mais servidores do que
antigamente, fazendo com que uma simples tarefa de atualiza��o dos
servidores seja extremamente trabalhosa e demorada.
O Ansible � uma ferramenta open source para orquestra��o e
automa��o da configura��o de servidores, que veio para facilitar a vida dos
administradores de sistemas. Com ele � poss�vel realizar tarefas como:
Instala��o e atualiza��o de pacotes, configura��o e deploy de aplica��es,
gerenciamento de usu�rios e varias outras tarefas administrativas com enorme
ganho de desempenho e produtividade.
Caracter�sticas
� � Escrito em Python � Diferentemente de outras ferramentas como:
Puppet e Chef, que s�o escritos em Ruby, o Ansible � escrito em Python
que � uma linguagem interpretada, de script, imperativa e orientada a
objetos;
� N�o necessita de agentes � Diferentemente de outras feramentas de
automa��o de configura��o como: Puppet e Chef, o Ansible n�o
necessita que agentes sejam instalados nos hosts remotos;
� Utiliza SSH para se conectar aos hosts remotos � O protolo SSH �
utilizado para acesso seguro a hosts remotos, o Ansible utiliza esse
protocolo para o acesso aos hosts;
� Utiliza linguagem JINJA2 para os templates;
� Utiliza a linguagem YAML para escrever os playbooks � YAML � uma
linguagem que � facilmente entendida por seres humanos;
� Vasta quantidade de m�dulos e c�digos no github � Atrav�s do site
https://galaxy.ansible.com/ ou do comando ansible-galaxy, � poss�vel
baixar e reutilizar playbooks escritos por outros usu�rios.
Outra caracter�stica importante � que o Ansible funciona de forma
idempotent, isso significa que um comando s� ser� aplicado quando ele
realmente necessitar ser aplicado. Para entender melhor o que significa ser
idempotent, imagine que foi escrita uma tarefa para instalar um determinado
pacote, ao ser executada primeiramente o Ansible ir� verificar se o pacote
existe no host remoto, caso n�o exista a tarefa ser� executada e o pacote ser�
instalado, caso exista a tarefa n�o ser� executada. Esse comportamento vale
para o Ansible de uma forma geral, apenas a tarefa de instala��o de pacotes.
Instala��o
O Ansible n�o necessita ser instalado em todos os hosts do seu
parque de servidores, apenas no host que ir� gerenciar os outros. � necess�rio
apenas que nos servidores que ser�o gerenciados, tamb�m chamados de hosts
remotos, se tenha instalado um interpretador python. Caso o interpretador
python instalado na m�quina remota seja inferior a vers�o 2.5, � necess�rio a
instala��o do pacote python-simplejson
A instala��o do Ansible no host de ger�ncia � bem simples, n�o s�o
exigidos daemons ou banco de dados. Mesmo sendo poss�vel a instala��o do
Ansible atrav�s do c�digo fonte, s� irei abordar a instala��o atrav�s dos
gerenciadores de pacotes YUM e APT, que � a forma sugerida pelo pr�prio site
da ferramenta.
Sistema Operacionais Red Hat Like
Para instala��o do Ansible em sistema operacionais baseados em
Red Hat (Red Hat, Fedora, CentOS), � necess�rio adicionar ao gerenciador de
pacotes YUM o reposit�rio EPEL e em seguida, executar o seguinte comando:
$ yum install ansible
Sistemas Operacionais Debian Like
Para instala��o do Ansible em sistema operacionais baseados em
Debian (Debian, Ubuntu), � necess�rio executar os seguintes comandos:
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
Ap�s a instala��o, o comando � $anisble �version � poder� ser
executado para verificar qual a vers�o do Ansible foi instalada.
Para maiores informa��es sobre a instala��o do Ansible em outras
plataformas, ou at� utilizando o c�digo fonte, basta acessar a p�gina da
documenta��o oficinal da ferramenta cujo endere�o �:
http://docs.ansible.com/ansible/intro_installation.html
Comandos
Com a instala��o do pacote ansible alguns comandos, listados logo
abaixo, s�o adicionados ao path do sistema operacional. Iremos detalhar cada
um dos comandos e termos apresentandos posteriormente.
� ansible � Executa tasks (tarefas) em hosts
� ansible-doc � Exibe a documenta��o dos m�dulos do ansible
� ansible-galaxy � Gerencia roles utilizando a comunidade
galaxy.ansible.com
� ansible-playbook - Executa um ansible playbook
� ansible-pull � � utilizado para configurar uma c�pia remota do ansible em
cada host gerenciado.
� ansible-vault � Criptografa e ger�ncia arquivos criptografados YAML
Conceitos Importantes
O Ansible n�o � uma ferramenta complexa, por�m existem muitos
termos e conceitos que s�o importantes para a sua correta utiliza��o.
Acredito que para come�armos a utiliza-lo � importante aprendermos os
itens listados a seguir:
� Inventory � Lista de hosts que ir�o receber os comandos executados
pelo servidor Ansible;
� Modules � Controlam os recursos (servi�os, pacotes, arquivos, etc.) do
host remoto;
� Tasks � Tarefa que ser� executada no(s) host(s);
� Playbook - Conjunto de tarefas que ser�o executadas no(s) host(s);
� Roles - S�o maneiras de carregar automaticamente determinados
arquivos como: vars_files, tasks e handles com base numa estrutura de
arquivo conhecidos.
Inventory
O invent�rio � uma parte importante na arquitetura do Ansible, �
nele que ser� definida a lista de hosts que ir�o receber os comandos do
servidor Ansible. Por padr�o, o invent�rio est� localizado em
/etc/ansible/hosts, mas nada impede que voc� informe o invent�rio de hosts
em outro lugar, utilizando a op��o -i ao executar playbooks e comandos adhoc.
Al�m de hosts, o invent�rio pode se utilizado para declara��o de
vari�veis e par�metros para acesso do Ansible ao host remoto. Lembrando que
o Ansible sempre utiliza os hosts definidos no arquivo de invent�rio para
execu��o de playbooks e comandos ad-hoc.
Em seguida � apresentado um exemplo de arquivo
/etc/ansible/hosts e no Anexo I desse documento s�o listados alguns
par�metros que podem ser declarados no arquivo de invent�rio.
mail.example.com
#Definindo grupo de servidores webservers
[webservers]
foo.example.com
bar.example.com
host1 http_port=80 maxRequestsPerChild=808
#Definindo grupo de servidores dbservers
[dbservers]
one.example.com
two.example.com
# Definindo grupo global web no inventory
[web:children]
webservers
dbservers
# Definindo vari�veis para o grupo webservers no inventory
[webservers:vars]
ntp_server=ntp.example.com
proxy=proxy.example.com
M�dulos
O Ansible possui uma grande quantidade de m�dulos predefinidos
que podem ser utilizados para executar tarefas nos hosts remotos tanto
atrav�s de comandos ad-hoc (executam apenas uma tarefa) como de
playbooks (executam v�rias tarefas), al�m disso, os usu�rios podem escrever
seus pr�prios m�dulos.
Para obter mais informa��es sobre os m�dulos do Ansible, basta
acessar o endere�o http://docs.ansible.com/ansible/modules.html ou utilizar os
seguintes comandos:
� $ansible-doc -l : Lista todos os m�dulos predefinidos do Ansible
� $ansible-doc [nome_do_m�dulo]: Exibe informa��es espec�ficas de um
m�dulo
Comandos Ansible Ad-Hoc
Lembrando que os hosts que ir�o receber as altera��es realizadas
pelo Ansibles, devem estar cadastrados no arquivo de invent�rio
/etc/ansible/hosts ou em qualquer outro arquivo desde que ao executar o
comando ad-hoc ou playbook seja expecificado o arquivo de hosts com a op��o
-i
Segue o comando Ansible para executar tarefas
$ansible <host> [op��es]
<host>- Host ou grupo de hosts que ser�o afetados pelo comando, all pode ser
definido para referenciar todos os hosts do arquivo de invent�rio.
Seguem algumas op��es importantes do comando ansible
-i [invent�rio] � Especificando um arquivo de invent�rio ex: -i /ansible/hosts
-m [m�dulo] � Especificando m�dulo
-u [usu�rio] � Especificando usu�rio SSH para acesso remoto
-k � A senha do usu�rio ssh ser� solicitada ap�s a execu��o do comando
-s � O modo super usu�rio (sudo) ir� ser utilizado para execu��o do comando
-K � A senha sudo do usu�rio ir� ser� solicitada ap�s execu��o do comando
-a [�modules_args�] - Define algumentos dos m�dulos
-a [�comando linux�] - Comando Linux a ser executado num host remoto
-- version � Exibe a vers�o instalada do Ansible
Segue o comando Ansible para executar tarefas utilizando m�dulos:
$ansible <host> -m <m�dulo> -a �<par�metros_do_modulo>�
Com a execu��o do comando, voc� dever� receber no prompt de
comando algumas mensagens informando o resultado e se ele foi realizado
com sucesso ou falha. O quadro abaixo apresenta a execu��o de um comando
ansible especificando apenas o host chamado �wolverine� onde o comando
linux hostname � executado no host remoto, e como resultado � mostrado que
foi realizado com sucesso e na ultima linha o resultado de sua execu��o.
$ansible wolverine -i hosts -a "hostname"
wolverine | SUCCESS | rc=0 >>
wolverine
Segue abaixo alguns exemplos de comandos ad-hoc Ansible
utilizando os mais variados m�dulos:
Testando conectividade do Ansible
#Executa um ping entre os hosts
$ansible tomcat1 -i /ansible/hosts -m ping -u root -k
Gathering Facts Ansible
#lista as veri�veis facts do host tomcat1
$ansible tomcat1 -i /ansible/hosts -m setup -u root -k
Execu��o de comandos linux
#Lista informa��es de mem�ria de todos os hosts cadastrados no arquivo host
$ansible all -i /ansible/hosts -a �free -m� -u root -k
#Lista informa��es de parti��es do host remoto server1
$ansible server1 -i /ansible/hosts -a �df -m� -u root -k
#Reinicia o servi�o httpd no host remoto webhost
$ansible webhost -i /ansible/hosts -a �service httpd restart� -u root -k
Instala��o de pacotes
#Instala o pacote httpd(apache) em servidor Red Hat Like
$ansible webservers -m yum -a "name=httpd state=present" -u root -k
#Instala o pacote iptraf em servidor Debian Like
$ansible webservers -m apt -a "name=iptraf state=present" -u root -k
Gerenciamento de servi�os
#Verifica se o servi�o httpd est� iniciado, caso n�o esteja ele ser� iniciado
$ansible webservers -m service -a "name=httpd state=started" -u root -k
Gerenciamento de usu�rios
#Cria o usu�rio de nome user1 em todos os hosts presentes no arquivo hosts
$ansible all -m user -a "name=user1 password=<crypted password here>" -u
root -k
Gerencimento de arquivos e pastas
#Copia o arquivo /etc/hosts do host local para o arquivo /tmp/hosts do host
remoto atlanta.
$ansible atlanta -m copy -a "src=/etc/hosts dest=/tmp/hosts" -u root -k
#Cria o diret�rio /backup/mp3 no host remoto webserver setando alguns
par�metros de permiss�o.
$ansible webserver -m file -a "dest=/backup/mp3 mode=755 owner=vamberto
group=admin state=directory" -u root -k
Gerenciamento de Banco de Dados Mysql
#Cria o database diretoria no mysql do host remoto dbserver
$ansible dbserver -m mysql_db -a � name=diretoria state=present�
#Cria o usu�rio admin, define sua senha e privil�gios no mysql do host remoto
dbserver
$ansible dbserver -m mysql_user -a �name=admin password=12345
priv=*.*:ALL state=present�
Uma lista com todos os m�dulos, e seus par�metros, est�
dispon�vel no endere�o:
http://docs.ansible.com/ansible/modules_by_category.html. � recomend�vel
que voc� acesse o endere�o e verifique os principais m�dulos, juntamente com
os par�metros para a sua utiliza��o.
Playbooks
Playbooks s�o o motivo pelo qual o Ansible ser uma ferramenta t�o
poderosa, s�o com eles que realizamos a automa��o da configura��o e
orquestra��o de servidores. Se com os comandos ad-hoc n�s realizamos
apenas uma tarefa por vez, com o uso de playbooks n�s realizamos varias
tarefas de uma s� vez. Desde a instala��o de pacotes, configura��o e deploy
de aplica��es, verifica��o de servi�os, atualiza��o do sistema, etc.
Como foi dito anteriormente, os playbooks s�o escritos numa
linguagem chamada YAML que � de f�cil interpreta��o pelos humanos. Para
criarmos o nosso primeiro playbook, primeiramente devemos criar um arquivo
(com editor de texto de sua prefer�ncia) iniciando ele com os caracteres � --- �,
isso sinaliza que o arquivo � escrito com a linguagem YAML, em seguida
declaramos quais os hosts ou grupos de hosts (de acordo com o invent�rio de
hosts criado anteriormente) com a op��o � � hosts: �, utilizamos a op��o �
tasks: � e depois disso podemos declarar as tarefas (tasks) que o playbook ir�
executar nos hosts remotos.
---
- hosts: <hosts>
tasks:
- name: <Nome da tarefa>
<modulo>: <par�metros_do_modulo>
Algumas concidera��es devem ser feitas: A indenta��o � uma parte
fundamental da linguagem YAML, linhas de c�digos com erro de indeta��o
causar�o falha ao tentar executar o playbook. � poss�vel escrever tarefas
(tasks) sem a op��o �- name�, por�m aconselho utiliz�-la pois a descri��o
utilizada na op��o ir� aparecer durante a execu��o do playbook, tornando
assim muito mais f�cil de sabermos o que est� sendo executado. O exemplo de
c�digo informado acima cont�m apenas o m�nimo necess�rio para se escrever
um playbook, vari�veis, configura��o de conex�o, permiss�es, etc. Tamb�m
podem ser declaradas no playbook. Exemplos mais detalhados ser�o
apresentados posteriormente.
Utiliza��o de playbooks (exemplo 1)
Antes de partirmos para a cria��o do nosso primeiro playbook, irei
apresentar o ambiente de teste criado. Instalei uma m�quina de teste no
virtualbox (ambiente virtual) cujo hostname � ansibletest com endere�o ip
192.168.0.100/24, essa m�quina receber� as configura��es da m�quina
ansible, cujo endere�o ip � 192.168.0.10/24. O host ansible utiliza o sistema
operacional Ubuntu 14.04 e possui instalado o pacote ansible, enquanto o host
ansibletest utiliza o sistema operacional CentOS 7.0 e ter� o interpretador
python instalado.
Na m�quina Ansible criei uma entrada IP/hosname no arquivo
/etc/hosts, referenciando a m�quina ansibletest e configurei o uso do SSH sem
senha da m�quina ansible para a m�quina ansibletest.
/etc/hosts da m�quina ansible
127.0.0.1 localhost
127.0.1.1 ansible
192.168.0.100 ansibletest
A pasta /ansible foi criada para armazenar o arquivo de hosts e
todos os playbooks criados. Primeiramente temos que criar um arquivo
/ansible/hosts (com o editor de textos de sua escolha) que funcionar� como
nosso invent�rio, esse arquivo ter� apenas o nome do host remoto que ir�
receber os comandos declarados no playbook, no nosso caso, esse arquivo ter�
apenas o nome ansibletest. Caso o host remoto n�o tenha uma entrada no
DNS, voc� pode utilizar o endere�o IP ao inv�s do nome. Em seguida, na
mesma pasta onde o arquivo de hosts est� criado, vamos criar um arquivo
chamado playbook_apache.yml com as linhas apresentadas abaixo:
/ansible/playbook_apache.yml
---
- hosts: all
tasks:
- name: Atualizando o sistema operacional
yum: name=* state=latest
- name: Instalando a vers�o mais atual do apache
yum: name=httpd state=latest
Figura 1: Topologia do ambiente de teste
- name: Garantindo que o apache est� rodando
service: name=httpd enabled=yes state=running
Esse playbook ser� aplicado em todos os servidores declarados no
arquivo hosts e ir� executar 3 tarefas: Atualiza��o do sistema operacional,
instala��o da vers�o mais recente do servidor web Apache e garantir que o
Apache esteja rodando e configurado para se iniciado automaticamente na
inicializa��o do sistema operacional. � importante salientar que as tasks
(tarefas) no ansible s�o executadas na ordem em que elas s�o declaradas no
arquivo playbook.
Para executar o playbook criado, basta acessar a pasta /ansible e
digitar o seguinte comando:
$ansible-playbook -i hosts playbook_apache.yml
Na Figura Erro: Origem da refer�ncia n�o encontrada 2 �
apresentado o resultado da execu��o do playbook_apache.yml. Na primeira
task �Atualizando o sistema operacional� nenhuma altera��o foi realizada, o
Sistema Operacional j� estava atualizado. Na segunda e terceira task �
Instalando a vers�o mais atual do apache� e �Garantido que o apache est�
rodando� respectivamente, podemos perceber que o Ansible realizou
altera��es, instalando e inicializando o servidor web Apache.
Figura 2: Execu��o do playbook_apache.yml
Observando melhor a imagem, al�m da execu��o das 3 tasks que
declaramos no playbook, uma quarta task foi executada, a �setup�. A task
setup �, por padr�o, sempre executada e ela � utilizada na descoberta de
vari�veis chamadas de facts do host remoto. Iremos explicar melhor o que s�o
e como fazer uso das facts posteriormente.
Utiliza��o de playbooks (exemplo 2)
No exemplo 2 n�s iremos escrever um playbook que ir� instalar o
servi�o Network Time Protocol (NTP) no host ansible teste e ir� configura-lo
para que ele busque a hora num suposto servidor ntp em nossa rede
(ntpserver.minharede.com) no host ansibletest.
O playbook apresentado abaixo ser� aplicado em todos os hosts do
arquivo hosts e ir� executar 3 tarefas: Instala��o do pacote ntp, copiar o
arquivo de configura��o (ntp.conf) da m�quina onde o ansible est� executando
para o host remoto e efetuar o restart do servi�o ntp.
Vamos utilizar a mesma topologia e arquivo hosts apresentados no
exemplo 1. Na mesma pasta onde o arquivo de hosts est� criado, vamos
criar um arquivo chamado playbook_ntp.yml com o conte�do apresentado
abaixo:
/ansible/playbook_ntp.yml
---
- hosts: all
tasks:
- name: Instalando a vers�o mais atual do ntp
yum: name=ntp state=latest
- name: Copiando o arq de configura��o do ntp
copy: src=/ansible/files/ntp.conf dest=/etc/ntp.conf
- name: Garantindo que o servi�o ntp est� rodando
service: name=ntp state=reloaded
Al�m do arquivo playbook_ntp.yml, n�s precisamos criar o arquivo
ntp.conf na pasta /ansible/files para que ele seja copiado e substitua o
arquivo /etc/ntp.conf no host remoto.
/ansible/files/ntp.conf
driftfile /var/lib/ntp/ntp.drift
statsdir /var/log/ntpstats/
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
server ntpserver.minharede.com
restrict 127.0.0.1
restrict ntpserver.minharede.com
restrict ::1
Para executar o playbook criado, basta digitar o seguinte comando:
$ansible-playbook -i hosts playbook_ntp.yml
Na Figura Erro: Origem da refer�ncia n�o encontrada 3 �
apresentado o resultado da execu��o do playbook_ntp.yml. Na primeira task o
Ansible ir� instalar a vers�o mais atual do NTP, Na segunda e terceira task
respectivamente o Ansible ir� copiar o arquivo de configura��o que criamos
para o host ansibletest e reiniciar o servi�o NTP.
Como prova que o Ansible funciona de maneira idempotent,
executei novamente o mesmo playbook e o resultado pode ser conferido na
Figura Erro: Origem da refer�ncia n�o encontrada 4.
Figura 3: Primeira execu��o do playbook_ntp.yml
Como podemos perceber, o Ansible n�o realizou nenhuma
altera��o nas tarefas de instala��o e copia do arquivo de configura��o do NTP,
pois ambos j� tinham sido realizadas na primeira execu��o do
playbook_ntp.yml
Conclus�o
Apensar do pouco apresentado at� agora, podemos perceber o
qu�o poderosa e �til � o Ansible no gerenciamento da configura��o e
osquestra��o dos servidores, nos exemplos apresentados nesse documento,
executamos tarefas em apenas um host, mas e se tiv�ssemos dezenas,
centenas ou at� milhares de hosts para administrar ?
Na pr�xima vers�o desse documento, ao qual j� est� em
desenvolvimento, irei apresentar alguns conceitos mais avan�ados do Ansible,
a utiliza��o de vari�veis, configura��o de aplica��es usando templates,
notifica��o de servi�os utilizando handlers, organiza��o e execu��o de
playbooks utilizando roles, criptografia utilizando o ansible-vault.
Figura 4: Segunda execu��o do playbook_ntp.yml
Anexo I
No anexo I � apresentado uma lista com par�metros que podem ser
utilizados na comunica��o entre o servidor Ansible e o(s) host(s) remoto(s).
Todas esses par�metros apresentados foram retirados do site da
documental��o oficial do Ansible, que pode ser acessa atrav�s do endere�o
http://docs.ansible.com/ .
ansible_connection - Connection type to the host. This can be the name of
any of ansible�s connection plugins. Common connection types are local, smart,
ssh or paramiko. The default is smart.
SSH connection:
ansible_host - The name of the host to connect to, if different from the alias
you wish to give to it.
ansible_port - The ssh port number, if not 22
ansible_user -The default ssh user name to use.
ansible_ssh_pass - The ssh password to use (this is insecure, we strongly
recommend using --ask-pass or SSH keys)
ansible_ssh_private_key_file - Private key file used by ssh. Useful if using
multiple keys and you don�t want to use SSH agent.
ansible_ssh_common_args - This setting is always appended to the default
command line for sftp, scp, and ssh. Useful to configure a ProxyCommand for
a certain host (or group).
ansible_sftp_extra_args - This setting is always appended to the default sftp
command line.
ansible_scp_extra_args - This setting is always appended to the default scp
command line.
ansible_ssh_extra_args - This setting is always appended to the default ssh
command line.
ansible_ssh_pipelining - Determines whether or not to use SSH pipelining.
This can override the pipelining setting in ansible.cfg.
Privilege escalation
ansible_become - Equivalent to ansible_sudo or ansible_su, allows to force
privilege escalation
ansible_become_method - Allows to set privilege escalation method
ansible_become_user - Equivalent to ansible_sudo_user or ansible_su_user,
allows to set the user you become through privilege escalation
ansible_become_pass - Equivalent to ansible_sudo_pass or ansible_su_pass,
allows you to set the privilege escalation password
Remote host environment parameters:
ansible_shell_type - The shell type of the target system. You should not use
this setting unless you have set the ansible_shell_executable to a non-Bourne
(sh) compatible shell. By default commands are formatted using sh-style
syntax. Setting this to csh or fish will cause commands executed on target
systems to follow those shell�s syntax instead.
ansible_python_interpreter - The target host python path. This is useful for
systems with more than one Python or not located at /usr/bin/python such as
*BSD, or where /usr/bin/python is not a 2.X series Python. We do not use the
/usr/bin/env mechanism as that requires the remote user�s path to be set
right and also assumes the python executable is named python, where the
executable might be named something like python2.6.
ansible_*_interpreter - Works for anything such as ruby or perl and works
just like ansible_python_interpreter. This replaces shebang of modules which
will run on that host.

Potrebbero piacerti anche