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
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
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
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
160
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
340
2年かけて Deno に DOMMatrix を実装した話 / How I implemented DOMMatrix in Deno over two years
petamoriken
0
210
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
160
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
740
楽しそうなつよつよエンジニアと目が死んでる僕/A brilliant engineer having a blast, and dead-eyed me.
3l4l5
2
200
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
500
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
1
460
仕様駆動開発の消費期限
watany
20
8.8k
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
250
Featured
See All Featured
Making Projects Easy
brettharned
120
6.7k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
350
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.4k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
550
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
470
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.6k
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