Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Automatización de tareas con Ansible
Search
César Suárez Ortega
March 14, 2015
Programming
390
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
350
Procesanso datos con Hadoop: MapReduce y YARN
csuarez
0
380
Introducción a SCRUM
csuarez
0
360
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
Android CLI
fornewid
0
220
数百円から始めるRuby電子工作
tarosay
0
150
関東Kaggler会_NVIDIA_Nemotron_コンペ_振り返り
rick_ds
0
580
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
150
php-fpmのプロセスが枯渇した日-調査・対処・そして本当にやるべきだったこと-
shibuchaaaan
0
290
yield再入門 #phpcon
o0h
PRO
0
1.1k
React本体のコードリーディング
high_g_engineer
1
140
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.8k
「人を評価する AI」の設計と実装
ryoyanara
0
200
Google Apps Script で Ruby を動かす
kawahara
0
230
テーブルをDELETEした
yuzneri
0
140
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Leo the Paperboy
mayatellez
8
2.1k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
490
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2.3k
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