Você está na página 1de 19

Introdução ao Ansible

Paulo Silva <pjs@eurotux.com>


Ansible

● Ferramenta de automação open source

● Agentless - ligação por ssh

● Push de configurações

● Sintaxe de playbooks em YAML


Como funciona

Host 1
(ssh)

Inventário

Host 2
Host de
(ssh)
Gestão
(ansible)

Playbook

Host N
(ssh)
Requisitos

Host de gestão (control machine):

● python (2.6+, 3.5+)


● ansible (package manager / pip / source)
● Windows não suportado

Hosts geridos:

● python (2.6+, 3.5+) + ssh - Linux/UNIX


● PowerShell (3+), .NET (4.0+), WinRM - Windows
Inventário # cat hosts
[webservers]
web[1-3] http_port=8080
● ficheiro / pasta com hosts geridos [dbs]
db1 database_name=xpto1
db2 database_name=xpto2
● grupos de hosts
[datacenter:children]
webservers
● variáveis por host / grupo dbs

[datacenter:vars]
● syntax INI ou YAML
ansible_ssh_user=pjs
ansible_become=yes
● possibilidade de inventários dinâmicos (p.e.

Cobbler, EC2, OpenStack)


Módulos

● biblioteca de módulos instalados com o ansible

● utilização ad-hoc / playbook

● parâmetros (obrigatórios / opcionais / valores default)

● documentação: ansible-doc <módulo>

● módulos diferentes para Windows

https://docs.ansible.com/ansible/latest/modules/modules_by_category.html
Execução Ad-Hoc

Execução de comandos:
ansible <hosts> -i <inventario> -m <modulo> [-a <args>]

Exemplo: criar utiliza pjs


ansible datacenter -i host -m user -a "name=pjs state=present"

Exemplo: instalar nginx nos webservers


ansible webservers -i host -m package -a "name=nginx"

https://docs.ansible.com/ansible/latest/cli/ansible.html
Playbooks ---
- hosts: webservers
vars:
myuser: pjs
tasks:
● escrito em YAML - name: install nginx
package: name=nginx state=present
- name: create user
● compostos por uma ou mais plays user:
name: "{{ myuser }}"
state: present
● cada play tem: home: "/srv/{{ myuser }}"

- hosts: dbs
○ hosts onde é executada (...)

○ lista de variáveis

○ uma lista de tasks sequenciais


Playbooks - execução
$ ansible-playbook playbook.yml -i hosts

PLAY [webservers] **************************************************************************************

TASK [install nginx] ***********************************************************************************


changed: [web1]
changed: [web3]
changed: [web2]

TASK [create user] *************************************************************************************


changed: [web3]
changed: [web1]
changed: [web2]

PLAY RECAP *********************************************************************************************


web1 : ok=2 changed=2 unreachable=0failed=0
web2 : ok=2 changed=2 unreachable=0failed=0
web3 : ok=2 changed=2 unreachable=0failed=0
Playbooks - idempotência
$ ansible-playbook playbook.yml -i hosts

PLAY [webservers] **************************************************************************************

TASK [install nginx] ***********************************************************************************


ok: [web2]
ok: [web3]
ok: [web1]

TASK [create user] *************************************************************************************


ok: [web3]
ok: [web2]
ok: [web1]

PLAY RECAP *********************************************************************************************


web1 : ok=2 changed=0 unreachable=0failed=0
web2 : ok=2 changed=0 unreachable=0failed=0
web3 : ok=2 changed=0 unreachable=0failed=0
Playbooks - condicionais

when - execução condicional

Exemplo:
- name: test if hostname is bad
shell: grep -c bad.domain /etc/hostname
register: my_grep

- name: "shut down CentOS 6 systems"


command: /sbin/shutdown -t now
when: my_grep.stdout == "0" and ansible_distribution == "CentOS"
Playbooks - loops

loop - iterar uma task sobre elementos de uma lista

Exemplo:
- name: install nagios-plugins
package: name="{{ item }}" state=present
loop:
- nagios-plugins-http
- nagios-plugins-disk
- nagios-plugins-procs
- nagios-plugins-load
- nagios-plugins-tcp
- nagios-plugins-ping
- nagios-plugins-users
- nagios-plugins-swap
Playbooks - handler

handler - tasks que só são executadas uma vez e quando houver alterações

Exemplo:
handlers:
- name: Restart ssh
service: name=sshd state=restarted

tasks:
- name: Disable root login with password
lineinfile: dest=/etc/ssh/sshd_config regexp="^PermitRootLogin" line="PermitRootLogin without-password"
notify: Restart ssh
- name: Force ssh loglevel
lineinfile: dest=/etc/ssh/sshd_config regexp="^LogLevel" line="LogLevel VERBOSE"
notify: Restart ssh
Templates - template:
src: templates/listen.j2
dest: /etc/httpd/conf.d/listen.conf
owner: apache
group: apache
● templates em formato Jinja2 mode: 0640

$ cat templates/listen.j2
# {{ ansible_managed }}
(http://jinja.pocoo.org/docs/templates/)
# http port
Listen {{ http_port }}
● variáveis de ansible usadas dentro dos {% if https_port is defined %}
# https port
Listen {{ https_port }}
{% endif %}
templates

● módulo template para aplicar templates a

ficheiros
Roles

● mecanismo para organizar e reutilizar código

● cada role tem as suas variáveis, tasks, handlers

● dentro do playbook os hosts podem pertencer a uma ou mais roles


- hosts: webservers
roles:
- common
- webservers

● Ansible Galaxy - repositório de roles (https://galaxy.ansible.com/)


Mais informações

https://docs.ansible.com/ansible/latest/index.html

https://www.ansible.com/resources

https://www.udemy.com/ansible-essentials-simplicity-in-automation/

Ansible: Up and Running (ISBN: 9781491979792)


Tópicos a explorar

● Ansible em Windows

● Tower / AWX

● Desenvolvimento de plugins / módulos

● Comparação com Puppet / Chef / Salt


Dúvidas?
Obrigado!

Você também pode gostar