Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Automatización de tareas con Ansible
Search
César Suárez Ortega
March 14, 2015
Programming
400
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Automatización de tareas con Ansible
César Suárez Ortega
March 14, 2015
More Decks by César Suárez Ortega
See All by César Suárez Ortega
Symfony y concurrencia: el componente Lock
csuarez
0
1.2k
PHP Episodio VII: El Despertar de la Fuerza
csuarez
1
310
Consumiendo una API REST con AngularJS
csuarez
0
400
Construyendo una API REST con Python y MongoDB
csuarez
0
360
Procesanso datos con Hadoop: MapReduce y YARN
csuarez
0
380
Introducción a SCRUM
csuarez
0
370
Introducción a GIT
csuarez
1
270
Using CAD Systems and E-Learning in radiologist training
csuarez
0
150
CETA-CIEMAT: Salud + Investigación
csuarez
0
150
Other Decks in Programming
See All in Programming
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
690
The Rails Doctrine Decade
koic
2
470
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
230
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
App Storeの外へ──日本のiOSサイドローディング入門 for iOSDC Japan 2026
yuukiw00w
0
290
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
430
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
330
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
380
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
450
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
120
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
340
Security issues being discussed on Web Platforms
petamoriken
0
1.4k
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
260
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
600
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
780
Test your architecture with Archunit
thirion
2
2.4k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
3.2k
Abbi's Birthday
coloredviolet
4
10k
Navigating Team Friction
lara
192
16k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
Transcript
Automatización de tareas con Seminario TheEvnt Preguntando a las ballenas
Devops con Ansible y Docker 13-14 Febrero (Cáceres)
csuarez César Suárez Ortega Software Engineer / Researcher tharandur
[email protected]
Software Engineer / Researcher César Suárez Ortega
None
http://www.meetup.com/phpcaceres 24 de Marzo // 18:30 // 7 Jardines LESS
IS MORE By Juan José Galán (@Jgalanlo)
www.suicidebystar.com
HERRAMIENTAS DE AUTOMATIZACIÓN ¿PARA QUÉ VALEN?
DESPLIEGUE DE APLICACIONES CONTINOUS DELIVERY VIRTUALIZACIÓN CLOUDS VAGRANT GESTIÓN DE
CONFIGURACIONES DOCKER TEST HOMOGENEIZACIÓN
None
Lenguaje Ruby DSL YAML YAML Agentless No No Sí Sí
Arquitectura Master/Slave Master/Slave Masterless Ambos Comunicación Propio Propio SSH ZeroMQ
None
¿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/
Cualquiera es mejor que nada
ANSIBLE 101 Empezando con Ansible
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/
None
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
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! !
$ 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
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”!
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!
PLAYBOOKS
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”
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!
---! - 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! ! !
None
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
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
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!
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
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
None
PLAYBOOKS++
Variables
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! ! ! !
Filtros ! ! ! ! {{ random_variable | mandatory }}!
! ! {{ some_port | default(80) }}! ! ! {{ http_response | to_nice_json }}! ! ! {{ password | hash(‘md5’) }}! ! ! {{ something | regex_replace(‘!@#/”!!!’) }}! ! ! !
Facts ¥ Variables del “sistema”. ¥ Algunas ¥ ansible_hostname! ¥ ansible_kernal! ¥ ansible_eth0.ipv4.address! ¥ …! ¥ Obtener
todas: $ ansible all –m setup!
Condicionales
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! ! ! ! ! ! !
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! ! !
Loops
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/*! ! !
Handlers
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!
Tags
! ! ---! - 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”! ! !
Includes
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’! ! ! ! ! ! !
ROLES
¿Qué son los roles? ¥ Organización de playbooks. ¥ “Convention over configuration”
¥ Carga automática de: ¥ Tasks ¥ Vars ¥ Handlers ¥ Dependencias ¥ Reutilizables
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! ! !
http://github.com/csuarez/theevnt-ansible
None
None