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
deck
- 271