introduccion a ansible
DESCRIPTION
Introducción a AnsibleTRANSCRIPT
introducción a ansible
devops-ar meetup
Buenos Aires - 23/junio/2014
ansibleAnsible es una herramienta que permite el manejo de configuraciones de una manera radicalmente simple, instalación de aplicaciones, ejecución de tareas y la orquestración de estas tareas en un entorno multinodo.
Esta plataforma fue creada por Michael DeHaan, autor de la aplicación de provisionamiento de servidores Cobbler y co-autor de la herramienta para administración remota Func.
DeHaan toma el nombre del sistema ficticion de comunicación instántanea en el hiperespacio mencionado en el libro Ender's Game, de Orson Scott Card, y originalmente inventado por Ursula K. Le Guin en su novela de 1966 Rocannon's World.
Filosofia de diseño
● Proceso de instalación extremadamente sencillo con una curva de aprendizaje mínima.
● Super paralelo y super rápido por defecto.● No requiere demonios ni en los clientes ni en el servidor; utiliza solamente
sshd.● Utiliza un lenguaje fácil de entender y utilizar tanto para los usuarios como
para las computadoras.● Enfásis en la seguridad y la facilidad de auditoría/revisión/rescritura de
contenido.● Permite administrar equipos remotos instantaneamente, sin requerir
ninguna instalación inicial.● Permitir el desarrollo de módulos en cualquier lenguaje dinámico, no solo
Python (bash inclusive!)● No requiere permisos de root.● Ser la herramienta de automatización más fácil de utilizar, la más fácil!
requerimientosEquipo de Control
Actualmente Ansible puede ser ejecutado desde cualquier equipo con Python 2.6 instalado(soporte de Windows en camino).
Esto incluye Red Hat, Debian, CentOS, OS X, cualquiera de los BSDs, y compañia.
Los siguientes módulos de Python también deberán estar instalado (paramiko es opcional):
$ sudo pip install paramiko PyYAML jinja2 httplib2
Equipos administrados
En los equipos administrados, solo se requiere Python 2.4 o posterior, teniendo en cuenta que menor a Python 2.5 on the remotes, se va a requerir el siguiente módulo:
python-simplejson
Se puede utilizar una versión de python diferente a la que tiene el sistema, instalada de manera manual, por ejemplo.
arquitecturaEquipo de control Equipos administrados
SshdPython 2.4+
Python 2.6+ansibleplaybooks
ssh
ssh
El equipo de control puede ser un servidor, una laptop. Puede tener conexión por ssh o estar detrás de un jumphost o un firewall.
instalaciónPara instalar desde código fuente.$ git clone git://github.com/ansible/ansible.git$ cd ./ansible$ source ./hacking/env-setup
Latest Release Via YumRPMs are available from yum for EPEL 6, 7, and currently supported Fedora distributions.# install the epel-release RPM if needed on CentOS, RHEL, or Scientific Linux$ sudo yum install ansible
Latest Releases Via Apt (Ubuntu)$ sudo apt-get install apt-add-repository$ sudo apt-add-repository ppa:rquillo/ansible$ sudo apt-get update$ sudo apt-get install ansible
RecomendadoLatest Releases Via Pip
$ sudo pip install ansible
Disponible para Via pkg (FreeBSD)y Homebrew (Mac OSX)
configuración del inventarioEl inventario (inventory) es una descripción de los nodos accesibles por Ansible. El Inventory se define en un archivo de
confirmación en formato INI, cuya ubicación predeterminada es /etc/ansible/hosts.
[dbservers]
sql1.example.com
[webservers]
foo.example.com
bar.example.comPuede contener hostnames y/o direcciones IP únicamente o definidos en grupos como los mostrados: webservers o
dbservers.
Groups
Servers
módulos● Los módulos se consideran la unidad de trabajo en Ansible. ● Es código que se ejecuta en el equipo administrado.● Cada módulo es básicamente independiente y puede ser escrito en
cualquier lenguaje de programación de scripts como Python, Perl, Ruby, bash, etc.
● Una de las principales características de los módulos es la idempotencia, que significa que una vez que el sistema ha alcanzado el estado deseado, el mismo se mantiene sin importar la cantidad de veces que se repitan las mismas acciones.
● Se copian por SSH hacia el equipo administrado donde son ejecutados.
● Devuelven datos en formato JSON que es interpretado por ansible.
módulos de ansible (core)● apt/yum/pip Adicionar/Desinstalar paquetes● command/shell Ejecutar cualquier comando de shell (con o sin
ambiente).● copy Copiar archivos al servidor administrado● file Crear directorios, enlaces simbólicos, modificar permisos● service Iniciar/Detener/Habilitar servicios● template Similar a copy, pero con reemplazo de variables
(390 modules en http://docs.ansible.com/list_of_all_modules.html)
RTFM:ansible-doc -lansible-doc aptansible-doc copy
tarea / task
- name: Install Apache web server apt: pkg=apache2 state=latest
tarea / task
- name: Install Apache web server apt: pkg=apache2 state=latest
Documentación
Argumentos
Módulo
tarea / tasks
- name: Instalando un servidor web Apache con PHP apt: pkg={{ item }} state=latest with_items: - apache2 - php5 - libapache2-mod-php5 - php-apc
(usando un iterador)
tarea / tasks - name: Install Apache web server with PHP (apt version) apt: pkg={{ item }} state=latest with_items: - apache2 - php5 - libapache2-mod-php5 - php-apc when: ansible_distribution == ‘Ubuntu'"
- name: Install Apache web server with PHP (yum version) yum: pkg={{ item }} state=latest with_items: - httpd24 - php55 - php55-pecl-apc when: ansible_distribution == 'Amazon'
(usando facts)
tarea / tasks
- name: Copy website configuration copy: src=site.conf
dest=/etc/apache2/sites-available/site.conf owner=root group=root mode=0644 notify: restart apache tags: config
# Synchronization of src on the control machine to dest on the remote hostssynchronize: src=some/relative/path dest=/some/absolute/path
# Synchronization of two paths both on the control machinelocal_action: synchronize src=some/relative/path dest=/some/absolute/path
# Synchronization of src on the inventory host to the dest on the localhost inpull modesynchronize: mode=pull src=some/relative/path dest=/some/absolute/path
# Synchronization of src on delegate host to dest on the current inventory hostsynchronize: > src=some/relative/path dest=/some/absolute/path delegate_to: delegate.host
# Synchronize and delete files in dest on the remote host that are not found in src of localhost.synchronize: src=some/relative/path dest=/some/absolute/path delete=yes
# Synchronize using an alternate rsync commandsynchronize: src=some/relative/path dest=/some/absolute/path rsync_path="sudo rsync"
pasando parámetros al módulotarea / tasks
plays- name: This is a Play hosts: web-servers remote_user: ubuntu sudo: yes connection: ssh gather_facts: no vars: http_port: 80 cache_dir: /opt/cache
tasks: - name: create cache dir file: path={{ cache_dir }} state=directory
- name: install nginx yum: name=nginx state=installed
Son una serie ordenada de tareas ejecutadas en una seleccion de equipos.Se permite definir un control sobre el flujo de ejecución de las tareas.
playbooksansible-playbook es la herramienta para ejecutar los playbooks y permite definir:
● un conjunto secuencial de plays● un inventario● variables globales
$ ansible-playbook deploy.yaml -i production -e "componente=octopush version=2.3.90"
variables
roles
Se pueden definir tareas que se ejecuten antes Y después que los roles sean aplicados de la siguiente manera
---
- hosts: webservers
pre_tasks:
- shell: echo 'hello'
roles:
- { role: some_role }
tasks:
- shell: echo 'still busy'
post_tasks:
- shell: echo 'goodbye'
tareas pre/post
● ejecución condicional: se pueden establecer condiciones para la ejecución de una tarea mediante la directiva when: que evalua la condición y ejecuta la tarea si el resultado es verdadero.
● delegación de tareas: las tareas se pueden ejecutar en un servidor distinto al indicado por e playbook mediante la directiva delegate_to:, en el caso de que la acción se vaya a ejecutar en el mismo host, en vez de delegate_to: 127.0.0.1 se puede utilizar local_action: e indicar a continuación la tarea directamente.
● notificadores / notifiers / handlers. Son tareas que se ejecutan al final del playbook por una única vez, sin importar cuantas veces haya sido invocadas con el notify.
● raw commands Se puede utilizar ansible para ejecutar comandos en los servidores remotos sin necesidad de un playbook.
● scripts Son archivos de scripts que se copian al servidor remoto y se ejecutan. Automatizan la ejecución remota de scrips ya existentes.
otros
______________________
/ Ansible in a one-liner: \
\ chmod +x README.md /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Herramientas como Chef o Puppet son excelentes para administrar la configuración de equipos pero llegar a dominarlos requiere tiempo. Además, necesitan servidores adicionales y la instalación y configuración de un cliente en los equipos administrados. Por otro lado están herramientas como Fabric (Python) o Capistrano (Ruby) que solo necesitan una conexión por ssh a los equipos administrados para ejecutar las accciones definidas. Pero el conjunto de acciones disponibles es muy limitado y por lo general se va a requirer programación adicional.Ansible toma lo mejor de ambos ambos. Viene con un número impresionante de módulos y solo requiere conexión por ssh a los equipos administrados. Además, su curva de aprendizaje es mínima y no requiere ni servidores extras ni la instalación de agentes en los equipos remotos.
http://snappishproductions.com/2014/03/24/Spot-Instances-With-Ansible.html
referencias
● https://speakerdeck.com/phantomwhale/ansible-your-first-step-into-server-provisioning● http://rosstuck.com/multistage-environments-with-ansible/● http://www.slideshare.net/pas256/how-ansible-makes-automation-easy● http://lextoumbourou.com/blog/posts/getting-started-with-ansible/● http://tomoconnor.eu/blogish/getting-started-ansible● http://www.nickhammond.com/automating-development-environment-ansible/● https://gist.github.com/quicksnap/7490228