Travesuras
con Ansible

Sergio Guillen Mantilla

@donkeysharp

whoami_

  • Desarrollador
  • Flojo (por eso automatizo)
  • Miembro del #r00tHouse
  • Algunos pasatiempos
    • Hardware
    • Seguridad

$

Presentando...

  • Configuration Management

  • Despliegue de aplicaciones

  • Automatización

¿Para qué me sirve Ansible?

¿Qué me gusta de Ansible?

  • Simple (utiliza YAML)
- block:
  - name: Update repositories
    apt:
      update_cache: yes
      cache_valid_time: 3600

  - name: Install base packages
    apt:
      name: "{{item}}"
    with_items:
      - apt-transport-https
      - build-essential
      - git
      - vim
      - htop
      - lsof
      - dstat
      - strace
      - tmux

  • Descentralizado
  • Da para cualquier distro
  • Permite versionar
  • Hecho en Python <3
  • Sistema de Templates
  • FOSS

¿Qué me gusta de Ansible?

Varias formas de instalación

$ pip install ansible

$ sudo apt-get install ansible

$ sudo yum install ansible

$ git://github.com/ansible/ansible.git --recursive

Hagamos una analogía

Un programa cuenta con:

  • Un Punto de Ingreso
  • Entradas
  • Instrucciones
  • Variables
  • Sub Programas (reusar código)

El Punto de Ingreso

Playbooks

  • Punto de partida para ejecutar un conjunto de acciones
  • Estas acciones pueden ejecutarse localmente o remotamente
---
- hosts: web
  become: True
  vars_files:
    - group_vars/variables.yml

  pre_tasks:
    - debug: msg='Starting docker setup playbook'

  post_tasks:
    - debug: msg='Finished docker setup playbook'

  tasks:
    - name: Crear archivo plano
      file:
        path: /tmp/archivillo_2
        state: touch
        mode: 0755
        owner: ansible
        group: ansible

    - name: Crear un directorio
      file:
        path: /tmp/miDirectorio
        state: directory
        mode: 0700
        owner: ansible
        group: ansible

playbook.yml

Las Entradas

Inventory

  • Lista de servidores donde se ejecutarán las instrucciones
  • Esta lista puede ser agrupada (web, base de datos, etc.)
  • Es necesario tener acceso a estos servidores
[web]
107.170.35.179
107.170.35.123
107.170.34.214

[web:vars]
ansible_user=ansible
ansible_password=98765
ansible_become_password=98765

[load_balancer]
107.170.32.38

[load_balancer:vars]
ansible_user=ansible
ansible_password=123456
ansible_become_password=123456

inventory.yml

Las Instrucciones

Tasks

  • Un task llega a ser una instrucción en Ansible
  • Hace uso de alguno de los cientos módulos que ofrece Ansible
  • Cumple un objetivo
    • Crear/Actualizar/borrar algo
    • Iniciar/Detener algo

Módulos Ansible

Módulos Ansible

- digital_ocean:
    state: present
    command: droplet
    id: 123
    name: mydroplet
    api_token: XXX
    size_id: 2gb
    region_id: ams2
    image_id: fedora-19-x64
    wait_timeout: 500
- name: restart service
  systemd:
    state: restarted
    daemon_reload: yes
    name: crond
- name: Mount DVD read-only
  mount:
    path: /mnt/dvd
    src: /dev/sr0
    fstype: iso9660
    opts: ro
    state: present
- user:
    name: james
    shell: /bin/bash
    groups: admins,developers
    append: yes

- copy:
    src: /srv/myfiles/foo.conf
    dest: /etc/foo.conf
    owner: foo
    group: foo
    mode: "u=rw,g=r,o=r"
- name: Install base packages
  apt:
    name: "{{item}}"
  with_items:
    - apt-transport-https
    - build-essential
    - git
    - vim

Módulos Ansible

- name: LB config file
  template:
    src: templates/config.tpl
    dest: /etc/nginx/sites-available/default
    mode: "u=rw,g=r,o=r"

upstream nodes  {
  server {{server1}}:8000;
  server {{server2}}:8000;
  server {{server3}}:8000;
}
server {
  listen 80 default_server;
  listen [::]:80 default_server;

  root /var/www/html;

  server_name _;

  location / {
    proxy_pass  http://nodes;
  }
}

---
- hosts: web
  become: True
  vars_files:
    - group_vars/variables.yml

  pre_tasks:
    - debug: msg='Starting docker setup playbook'

  post_tasks:
    - debug: msg='Finished docker setup playbook'

  tasks:
    - name: Crear archivo plano
      file:
        path: /tmp/archivillo_2
        state: touch
        mode: 0755
        owner: ansible
        group: ansible

    - name: Crear un directorio
      file:
        path: /tmp/miDirectorio
        state: directory
        mode: 0700
        owner: ansible
        group: ansible

Las Variables

Archivo de Variables

vars.yml

nombre: Sergio Gabriel
apellido: Guillen Mantilla
var1: Valor de var1
db_user: ventas
dB_password: ventas123

Estructura de un Proyecto

inventories/
  production/
    inventory.yml
    group_vars/
      all.yml
      vars.yml

  development/
    inventory.yml
    group_vars/
      all.yml
      vars.yml

roles/
  role1/
  role2/
  role3/

playbook1.yml
playbook2.yml
playbook3.yml

21 reglas de precendencia

Los Sub Programas

Roles

  • Son los sub programas en un proyecto Ansible
  • Deben ser lo más genéricos posibles para su reutilización
  • De la misma forma tienen un conjunto de tasks
  • Son llamados desde playbooks

Roles

  • Los roles siguen una estructura de archivos
roles/
   common/
     files/
     templates/
     tasks/
     handlers/
     vars/
     defaults/
     meta/
  roles:
    - { role: base }
    - { role: web_base }
    - { role: lb_config, server1: "{{nodo1}}", server2: "{{nodo2}}", server3: "{{nodo3}}" }

Demo

Ansible y seguridad?

Algunas tareas

  • Despliegue de entornos vulnerables
  • Provisionar un entorno de pentesting
  • Continuous Security

deck

By Sergio Guillen