Docker + Ansible

Ansible como herramienta de aprovisionamiento de contenedores

Conceptos Básicos

Docker

  • Contenedor
  • Imagen
    • Herencia
    • Repositorios
  • Linking: enlaces entre contenedores

DevOps

  • Desarrollo + Operaciones
  • Gestión del ciclo de vida del producto
  • Tres caminos
    • Pensamiento sistemático
    • Retroalimentación amplificada
    • Experimentación contínua
  • CAMS: Cultura, Automatización, Medición, "Sharing"
  • Influencia de principios "Agile" en el desarrollo y operación

Ansible

¿Qué es Ansible?

  • Un motor de automatización de IT
  • Un sistema de gestión de configuración
  • Una herramienta para el despliegue contínuo de aplicaciones

Agentless

Operación sin agentes en los nodos

  • Máquina de Control (Solo Linux ATM)
  • Inventario de Hosts o Nodos
  • Variables por Grupo o Nodo

Pilares

  • Minimalismo
  • Consistencia e Idempotencia
  • Seguridad
  • Modularidad
  • Facilidad de aprendizaje

Tecnologías

  • Python ( 2.7 :-( )
  • YAML
  • Jinja2
  • OpenSSH

Módulos

  • Todos los proveedores Cloud principales
    • AWS, OpenStack, GCP, Azure, DO, etc.
  • Gestión de paquetes
    • APT, Yum, pacman, pip, npm...
  • Manejo de servicios
    • systemd, upstart, supervisord
  • Herramientas del sistema
    • Manejo de archivos, cron, firewall, selinux

Ansible Galaxy

Playbooks

Roles

Tasks

Modules

Docker + Ansible

¿Redundancia?

Opciones...

Ansible dentro del container

FROM ansible/ubuntu14.04-ansible:stable


RUN mkdir /srv/example
WORKDIR /srv/example
ADD site.yml /srv/example/

RUN ansible-galaxy install geerlingguy.memcached

RUN ansible-playbook site.yml -c local

EXPOSE 11211

# And then start up our service
ENTRYPOINT ["/usr/bin/memcached", "-u", "memcache", ...]

Ansible para el despliegue de containers

- name: sync app code
  synchronize: src={{ playbook_dir }}/../
               dest={{ app_path_server }}
               recursive=yes

- name: add docker directory
  file: path={{ app_path_server }}/docker state=directory

- name: add docker run scripts
  template: src={{ item }}.sh.j2 dest={{ app_path_server }}/docker/{{ item }}.sh
  with_items:
    - functions
    - prepare
    - run

- name: add dockerfile
  template: src=Dockerfile.j2 dest={{ app_path_server }}/docker/Dockerfile

- name: add docker-compose setup
  template: src=docker-compose.yml.j2 dest={{ app_path_server }}/docker-compose.yml

- name: build the service via docker-compose
  docker_service:
    project_src: "{{ app_path_server }}"

ansible-container

$ ansible-container init

$ ansible-container install

$ ansible-container build

$ ansible-container run

$ ansible-container push

$ ansible-container shipit

No solo automatiza la construcción de imágenes, sino que también gestiona todo el ciclo de vida de las aplicaciones.

ShipIt soporta actualmente Kubernetes y OpenShift

¡Gracias!

Docker y Ansible

By sebasmagri

Docker y Ansible

  • 514