Ansible

la batuta de Python

Ansible

Manuel Quiñones - @srmanuq - manuel.por.aca@gmail.com

  • Intro
  • Conceptos
  • Ansible
  • Ejemplos ad-hoc
  • Ejemplos playbook

Supongamos...

Que manejo una red de máquinas,
estoy en una de ellas,
con acceso por SSH a todas las otras.


Quiero saber en principio, si me puedo comunicar con cada una.

$ ansible all -m ping

ShellShock!

Quiero actualizar bash porque se encontró una vulnerabilidad.

$ ansible all -m yum -a "name=bash state=latest"


yum está bien si mis hosts son tipo RedHat, si son tipo Debian?

$ ansible all -m apt -a "name=bash state=latest"

Si la red está formada por ambos, cambio de método:

----
- name: vacuna para el ShellShock
  hosts: all
  sudo: yes
  tasks:
   - name: asegurarse de que Bash esté en la última versión en los RedHat
     yum: name=bash state=latest
     when: ansible_os_family == "RedHat"
   - name: asegurarse de que Bash esté en la última versión en los Debian
     yum: name=bash state=latest
     when: ansible_os_family == "Debian"

vacuna.yaml

$ ansible-playbook -K vacuna.yaml

Orquestación, conceptos

cloud computing

arquitectura orientada a servicios

aprovisionamiento, deploy

instalar y configurar software, base de datos, servidor web, crear usuarios y grupos

virtualización

se simula el HW para permitir correr SW, una forma de administrar recursos

Breve historia de la automatización en Linux


La edad de piedra

Entrar por SSH host por host, parar un servicio, editar un archivo de configuración, volver a levantar el servicio. Ir acumulando un conjunto de scripts bash propios para automatizar esto.


Automatizando con frameworks

Hay frameworks para asistir en la automatización previa, como Chef (Ruby) o Fabric (Python). Pero sigue siendo una forma imperativa.


Orquestando, sistemas de estados, forma declarativa

Acá vamos ➔

Forma imperativa


def deploy():
    run("cd /path/to/application")
    run("./update.sh")
  

Framework Fabric.

Forma declarativa

En vez de llamar comandos, se define el estado deseado del sistema.

    ----
    file dest=/etc/httpd mode=755 owner=root group=root state=directory
  
    ----
    file dest=/etc/httpd state=absent
  

Playbooks de Ansible.

La herramienta de automatización se encarga de que el sistema alcance ese estado.

    ----
    tasks:
    - name: ensure apache is at the latest version
      yum: pkg=httpd state=latest
    - name: write the apache config file
      template: src=/srv/httpd.j2 dest=/etc/httpd.conf
      notify:
      - restart apache
    - name: ensure apache is running
      service: name=httpd state=started
    handlers:
      - name: restart apache
        service: name=httpd state=restarted

Forma declarativa


Es una capa de abstracción que aisla los detalles del "cómo" y te permite concentrar en el "qué".


El lenguaje declarativo es auditable por humanos.

Ejemplos: Puppet, Ansible, SaltStack


Características

Lenguaje declarativo (DSL)

Definición de recursos y estado deseado

Idempotencia

Se puede aplicar muchas veces, que el resultado es el mismo.

Información del sistema

se recolectan características del sistema (facts) y se usan como variables.
Ej: distro, procesador, hostname, IPs de las interfaces.

ansible

Ansible

Permite:

Manejar configuraciones

"Deployar" aplicaciones

Orquestar

Características

chiquito

no requiere mucha puesta en marcha, solo depende de SSH

agentless

sin servidores, demonios ni bases de datos

arquitectura simple

fácil de usar, fácil de extender

baterías incluídas,

muchos módulos built-in que cubren la mayoría de necesidades

ingredientes: tasks, handlers, variables y facts

Dependencias

Python, Py2 por ahora ب_ب

2.6+ en el server, 2.4+ en los nodos

OpenSSH como transporte

OpenSSH como transporte

Autenticación descentralizada, por credenciales.

Autenticación aconsejada es por claves SSH,
pero puede ser por contraseña.

No es requisito, se pueden usar otros transportes.

Internamente

Copia scripts (por sftp o scp) al /tmp del host remoto
los ejecuta por ssh,
y los elimina al final.

Inventario

/etc/ansible/hosts


[webservers]
server_uno.demo.com
server_dos.demo.com

[testers]
tester_uno.demo.com
tester_dos.demo.com

[develop]
develop.demo.com
  • una lista de hostnames en formato INI
  • se pueden agrupar hosts
  • permite patrones: server-[01:50].demo.com
  • pueden ser varios archivos en un directorio
  • puede ser dinámico, la lista se puede obtener de otras fuentes (ldap, etc)

 _____________________
< OK, hagamos algo... >
 ---------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

$ ansible all --list-hosts
$ ansible dbservers --list-hosts
$ ansible blue* --list-hosts
$ ansible www???.example.com --list-hosts

Ejemplos ad-hoc

ansible

"ad-hoc"

Son tareas que hacemos una sola vez, no las guardamos.

Se ejecutan en paralelo.

$ ansible all -m fetch -a "src=/var/log/boot.log dest=/tmp/logs"

Ejemplos playbook

ansible

Playbooks

Se ejecutan en orden.

Pueden disparar acciones al final de la corrida.

notify, handlers

Jinja para usar variables.

tanto en playbooks como en templates

$ ansible-playbook hola-mundo.yml
$ ansible-playbook -e "nombre=luli" hola-mundo2.yml

. . . . . . . . .

listo!

cc-by-sa @srmanuq
gifs: cc-by-sa @bigblueboo