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
390
Construyendo una API REST con Python y MongoDB
csuarez
0
340
Procesanso datos con Hadoop: MapReduce y YARN
csuarez
0
370
Introducción a SCRUM
csuarez
0
350
Introducción a GIT
csuarez
1
260
Using CAD Systems and E-Learning in radiologist training
csuarez
0
140
CETA-CIEMAT: Salud + Investigación
csuarez
0
150
Other Decks in Programming
See All in Programming
エンジニアにデザインハーネスを 〜デザインプロセスを規定するためのハーネス〜 / Design harness from an engineer's perspective
rkaga
2
1.6k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
FDEが実現するAI駆動経営の現在地
gonta
1
110
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
関数型プログラミングのメリットって何だろう?
wanko_it
0
180
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
310
act2-costs.pdf
sumedhbala
0
120
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
140
Performance Engineering for Everyone
elenatanasoiu
0
270
PHP Application における Kubernetes 内 gRPC 通信
ganchiku
0
510
えっ!!コードを読まずに開発を!?
hananouchi
0
220
Featured
See All Featured
Evolving SEO for Evolving Search Engines
ryanjones
0
240
Practical Orchestrator
shlominoach
191
11k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
590
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
290
Skip the Path - Find Your Career Trail
mkilby
1
170
My Coaching Mixtape
mlcsv
0
170
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
320
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
380
Context Engineering - Making Every Token Count
addyosmani
9
1k
Fireside Chat
paigeccino
42
4k
How to make the Groovebox
asonas
2
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