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 de
Gestão
(ansible)
Host 1
(ssh)
Host 2
(ssh)
Host N
(ssh)
Inventário
Playbook
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
● 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
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
● 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
(...)
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
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
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
● 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 %}
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!

DevOps Braga #5

  • 1.
    Introdução ao Ansible PauloSilva <pjs@eurotux.com>
  • 2.
    Ansible ● Ferramenta deautomação open source ● Agentless - ligação por ssh ● Push de configurações ● Sintaxe de playbooks em YAML
  • 3.
    Como funciona Host de Gestão (ansible) Host1 (ssh) Host 2 (ssh) Host N (ssh) Inventário Playbook
  • 4.
    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
  • 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 demó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 decomandos: 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 emYAML ● 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 (...)
  • 9.
    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
  • 10.
    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
  • 11.
    when - execuçãocondicional 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 emformato 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 paraorganizar 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/)
  • 16.
  • 17.
    Tópicos a explorar ●Ansible em Windows ● Tower / AWX ● Desenvolvimento de plugins / módulos ● Comparação com Puppet / Chef / Salt
  • 18.
  • 19.