Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automatización de tareas con Ansible

Automatización de tareas con Ansible

César Suárez Ortega

March 14, 2015
Tweet

More Decks by César Suárez Ortega

Other Decks in Programming

Transcript

  1. Automatización de tareas con Seminario TheEvnt Preguntando a las ballenas

    Devops con Ansible y Docker 13-14 Febrero (Cáceres)
  2. Lenguaje Ruby DSL YAML YAML Agentless No No Sí Sí

    Arquitectura Master/Slave Master/Slave Masterless Ambos Comunicación Propio Propio SSH ZeroMQ
  3. ¿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/
  4. 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/
  5. 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
  6. 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! !
  7. $ ansible all -m command -a ”pwd” –f 10 -k

    ! $ ssh-keygen -t rsa -C "[email protected]"! ! $ cat ~/.ssh/id_rsa.pub | \! ssh <user>@<host> “cat >> .ssh/authorized_keys”! Confianza SSH o
  8. 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”!
  9. 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!
  10. 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”
  11. 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!
  12. ---! - 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! ! !
  13. 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 <module_name>! http://docs.ansible.com/modules.html ! o
  14. 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
  15. 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!
  16. 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
  17. 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
  18. 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! ! ! !
  19. Filtros ! ! ! ! {{ random_variable | mandatory }}!

    ! ! {{ some_port | default(80) }}! ! ! {{ http_response | to_nice_json }}! ! ! {{ password | hash(‘md5’) }}! ! ! {{ something | regex_replace(‘!@#/”!!!’) }}! ! ! !
  20. 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! ! ! ! ! ! !
  21. 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! ! !
  22. 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/*! ! !
  23. 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!
  24. ! ! ---! -  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”! ! !
  25. 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’! ! ! ! ! ! !
  26. ¿Qué son los roles? ¥ Organización de playbooks. ¥ “Convention over configuration”

    ¥ Carga automática de: ¥ Tasks ¥ Vars ¥ Handlers ¥ Dependencias ¥ Reutilizables
  27. 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! ! !