Ansible é uma ferramenta de automação open source que permite a gestão de configurações de servidores de forma agentless através de SSH. Utiliza playbooks escritos em YAML para executar tarefas sequencialmente nos servidores geridos, de forma idempotente. Os playbooks podem incluir variáveis, loops, condicionais e notificações entre tarefas.
5. Inventário
● ficheiro / pasta com hosts geridos
● grupos de hosts
● variáveis por host / grupo
● syntax INI ou YAML
● possibilidade de inventários dinâmicos (p.e.
Cobbler, EC2, OpenStack)
# cat hosts
[webservers]
web[1-3] http_port=8080
[dbs]
db1 database_name=xpto1
db2 database_name=xpto2
[datacenter:children]
webservers
dbs
[datacenter:vars]
ansible_ssh_user=pjs
ansible_become=yes
6. 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
7. 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
8. Playbooks
● escrito em YAML
● compostos por uma ou mais plays
● cada play tem:
○ hosts onde é executada
○ lista de variáveis
○ uma lista de tasks sequenciais
---
- hosts: webservers
vars:
myuser: pjs
tasks:
- name: install nginx
package: name=nginx state=present
- name: create user
user:
name: "{{ myuser }}"
state: present
home: "/srv/{{ myuser }}"
- hosts: dbs
(...)
11. 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 - condicionais
12. 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
13. 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
14. Templates
● templates em formato Jinja2
(http://jinja.pocoo.org/docs/templates/)
● variáveis de ansible usadas dentro dos
templates
● módulo template para aplicar templates a
ficheiros
- template:
src: templates/listen.j2
dest: /etc/httpd/conf.d/listen.conf
owner: apache
group: apache
mode: 0640
$ cat templates/listen.j2
# {{ ansible_managed }}
# http port
Listen {{ http_port }}
{% if https_port is defined %}
# https port
Listen {{ https_port }}
{% endif %}
15. 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/)