Slide 1

Slide 1 text

Automatización de tareas con Seminario TheEvnt Preguntando a las ballenas Devops con Ansible y Docker 13-14 Febrero (Cáceres)

Slide 2

Slide 2 text

csuarez César Suárez Ortega Software Engineer / Researcher tharandur [email protected]

Slide 3

Slide 3 text

Software Engineer / Researcher César Suárez Ortega

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

http://www.meetup.com/phpcaceres 24 de Marzo // 18:30 // 7 Jardines LESS IS MORE By Juan José Galán (@Jgalanlo)

Slide 6

Slide 6 text

www.suicidebystar.com

Slide 7

Slide 7 text

HERRAMIENTAS DE AUTOMATIZACIÓN ¿PARA QUÉ VALEN?

Slide 8

Slide 8 text

DESPLIEGUE DE APLICACIONES CONTINOUS DELIVERY VIRTUALIZACIÓN CLOUDS VAGRANT GESTIÓN DE CONFIGURACIONES DOCKER TEST HOMOGENEIZACIÓN

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Lenguaje Ruby DSL YAML YAML Agentless No No Sí Sí Arquitectura Master/Slave Master/Slave Masterless Ambos Comunicación Propio Propio SSH ZeroMQ

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

¿Por qué Ansible? ¥ “Radically simple” ¥ Agentless ¥ Pocos requisitos (python, OpenSSH, …) ¥ Curva de aprendizaje escasa ¥ Configuración legible (YAML) ¥ Buena documentación ¥ http://docs.ansible.com/

Slide 13

Slide 13 text

Cualquiera es mejor que nada

Slide 14

Slide 14 text

ANSIBLE 101 Empezando con Ansible

Slide 15

Slide 15 text

Instalación $ sudo apt-get install software-properties-common! $ sudo apt-add-repository ppa:ansible/ansible! $ sudo apt-get update! $ sudo apt-get install ansible! $ sudo yum install epel-release! $ sudo yum install ansible! $ brew update! $ brew install ansible! $ sudo pip install ansible! http://brew.sh/

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

Inventories ¥  Inventario de máquinas ¥  Definición de nuestra infraestructura ¥  Formato INI ¥  Por defecto en /etc/ansible/hosts! ¥  Muchas vitaminas ¥ Grupos ¥ Rangos ¥ Parámetros ¥ … ¥  Inventories dinámicos

Slide 18

Slide 18 text

Inventories ! [webservers]! server1.company.com! server2.company.com! 188.234.123.12! ! [databases]! mysql-prod-[1:10].company.com! mysql-test-[a:f].company.com! ! [base]! dns.company.com ansible_ssh_user=root ansible_ssh_password=chapuza! dhcp.company.com ansible_conection=ssh! ! [storage]! ftp.company.com ftp_port=23! ! [misc]! some_alias ansible_ssh_host=134.23.42.123! !

Slide 19

Slide 19 text

$ ansible all -m command -a ”pwd” –f 10 -k ! $ ssh-keygen -t rsa -C "[email protected]"! ! $ cat ~/.ssh/id_rsa.pub | \! ssh @ “cat >> .ssh/authorized_keys”! Confianza SSH o

Slide 20

Slide 20 text

Nuestro primer comando :) ¥ ansible: Comando! ¥ all: Parte del inventario a usar.! ¥ -m command: Módulo ¥ -a "ls /tmp": Atributos del módulo $ ansible all -m command -a "ls /tmp”!

Slide 21

Slide 21 text

Más comandos $ ansible all -m copy -a "src=/tmp/foo dest=/tmp/foo"! $ ansible webservers -m yum -a "name=php5 state=present"! $ ansible all -m command -a ”pwd” –f 10 ! $ ansible all -m command -a ”rm –rf /” –i custom_inventory!

Slide 22

Slide 22 text

PLAYBOOKS

Slide 23

Slide 23 text

Introducción a Playbooks ¥ Automatización de tareas complejas. ¥ Ficheros en formato YAML. ¥ Definición de: ¥ Tareas ¥ Pasos ¥ Variables “Los módulos son las herramientas y los playbooks los planos”

Slide 24

Slide 24 text

YAML Ain’t Another Markup Language ---! -  hosts: webservers! ..vars:! ....http_port: 80! ....max_clients: 200! ....remote_user: root! ..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! ....- name: ensure apache is running! ......service: name=httpd state=started!

Slide 25

Slide 25 text

---! - hosts: webservers! vars:! http_port: 80! max_clients: 200! remote_user: root! 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! - name: ensure apache is running! service: name=httpd state=started! ! ! $ ansible-playbook my-playbook.yml! ! !

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

Módulos ¥ +200 incluidos por defecto ¥ Aceptan parámetros clave-valor: ¥  key1=value1, key2=value2, key3=value3! ¥ Ídempotentes ¥ No se ejecutan si no hace falta. ¥ Documentación: $ ansible-doc ! http://docs.ansible.com/modules.html ! o

Slide 28

Slide 28 text

Manejo de ficheros template: src=www.conf dest=/etc/php-fpm.d/www.conf! copy: src=www.conf dest=/etc/php-fpm.d/www.conf! copy template lineinfile: dest=/etc/foo regexp=^SELINUX= line=SELINUX=enforcing! lineinfile replace: dest=/foo regexp='(\s+)old(\s+.*)?$' replace='\1new\2’! replace

Slide 29

Slide 29 text

template [www]! ! listen = 127.0.0.1:9000! ! listen.allowed_clients = 127.0.0.1! ! user = {{ php_user }}! group = {{ php_group }}! ! pm = dynamic! pm.max_children = 50! pm.start_servers = 5! pm.min_spare_servers = 5! pm.max_spare_servers = 35! ! php_admin_value[error_log] = /var/log/php-fpm/www-error.log! php_admin_flag[log_errors] = on! ! php_value[session.save_handler] = files! php_value[session.save_path] = /var/lib/php/session!

Slide 30

Slide 30 text

Linux básico shell: chmod –R 777 /tmp! command: touch /tmp/foo! command shell yum: name=php-fpm state=latest #present, absent, ...! yum / apt service: name=httpd state=stopped #started, restarted, ...! service

Slide 31

Slide 31 text

Miscelánea git: repo=https://github.com/WordPress/WordPress.git dest=/! mysql_db: name=db state=present login_user=root login_password=! mysql_db git docker: image=foo/image_name links=postgresql:db,redis:redis! docker++ docker: image=centos command="service tomcat6 start" ports=8080! docker

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

PLAYBOOKS++

Slide 34

Slide 34 text

Variables

Slide 35

Slide 35 text

Uso de variables ! ! ! ! ! ! ---! - hosts: webservers! vars:! deploy_path: /var/www/html/current! base_packages: [php-fpm, mysql, nginx] ! tasks:! - name: deploy code! copy: src=local_wordpress/ dest={{ deploy_path }}! ! - name: copy wp-config! copy: src=config.php dest={{ deploy_path }}/wp-config.php! ! ! !

Slide 36

Slide 36 text

Filtros ! ! ! ! {{ random_variable | mandatory }}! ! ! {{ some_port | default(80) }}! ! ! {{ http_response | to_nice_json }}! ! ! {{ password | hash(‘md5’) }}! ! ! {{ something | regex_replace(‘!@#/”!!!’) }}! ! ! !

Slide 37

Slide 37 text

Facts ¥ Variables del “sistema”. ¥ Algunas ¥ ansible_hostname! ¥ ansible_kernal! ¥ ansible_eth0.ipv4.address! ¥ …! ¥ Obtener todas: $ ansible all –m setup!

Slide 38

Slide 38 text

Condicionales

Slide 39

Slide 39 text

when ! ! ! ! ! ! ! - name: ”apagar sistema Debian”! command: /sbin/shutdown -t now! when: ansible_os_family == ”Debian” ! ! - shell: echo ”sistemas RedHat 6 o superiores"! when: ansible_os_family == "RedHat" ! and ansible_lsb.major_release|int >= 6! ! ! ! ! ! !

Slide 40

Slide 40 text

Filtros interesantes ! tasks:! ! - shell: /usr/bin/foo! register: result! ignore_errors: True! ! - debug: msg=”¡falló!"! when: result|failed! ! - debug: msg=”¡cambió!"! when: result|changed! ! - debug: msg=”¡funcionó!"! when: result|success! ! - debug: msg=”¡se saltó!"! when: result|skipped! ! !

Slide 41

Slide 41 text

Loops

Slide 42

Slide 42 text

with_xxx vars:! php_packages: [php-xml, php-mysql, php-gd]! users:! user1:! nombre: Curro! apellido: Rodríguez! user2:! nombre: Álvaro! apellido: De la Mata! ! tasks:! - name: Instalar paquetes PHP! yum: name={{ item }} state=latest! with_items: php_packages! ! - name: Imprimir nombres! debug: msg=“{{ item.key }}: {{ item.value.nombre }} {{ item.value.apellido }}"! with_dict: users! ! - name: Copiar ficheros! copy: src={{ item }} dest=/tmp/! with_fileglob:! - /home/user/*! ! !

Slide 43

Slide 43 text

Handlers

Slide 44

Slide 44 text

Handlers ¥ Lanzar acciones cuando un módulo cambia ---! - hosts: webservers! vars:! http_port: 80! 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!

Slide 45

Slide 45 text

Tags

Slide 46

Slide 46 text

! ! ---! -  hosts: webservers! -  tasks:! - name: ensure apache is running! service: name=httpd state=started! tags:! - apache! - name: ensure php-fpm is running! service: name=php-fpm state=started! tags:! - php! ! ! $ ansible-playbook my-playbook.yml –-tags “php”! ! !

Slide 47

Slide 47 text

Includes

Slide 48

Slide 48 text

includes ! ! ! ! tasks:! ! - include: tasks/foo.yml! ! - include: wordpress.yml wp_user=timmy! - include: wordpress.yml wp_user=alice! - include: wordpress.yml wp_user=bob! ! - include: tasks/sometasks.yml! when: ansible_os_family == 'Debian’! ! ! ! ! ! !

Slide 49

Slide 49 text

ROLES

Slide 50

Slide 50 text

¿Qué son los roles? ¥ Organización de playbooks. ¥ “Convention over configuration” ¥ Carga automática de: ¥ Tasks ¥ Vars ¥ Handlers ¥ Dependencias ¥ Reutilizables

Slide 51

Slide 51 text

Estructura de roles ¥  some_role/! ¥  files/ * Ficheros para copy ¥  templates/ * Ficheros para template ¥  tasks/ ¥  handlers/ ¥  vars/ ¥  defaults/ * Valores por defecto ¥  meta/ * Dependencias ---! - hosts: webservers! roles:! - some_role! ! !

Slide 52

Slide 52 text

http://github.com/csuarez/theevnt-ansible

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content