la batuta de Python
Manuel Quiñones - @srmanuq - manuel.por.aca@gmail.com
Que manejo una red de máquinas,
estoy en una de ellas,
con acceso por SSH a todas las otras.
Quiero saber en principio, si me puedo comunicar con cada una.
$ ansible all -m ping
Quiero actualizar bash porque se encontró una vulnerabilidad.
$ ansible all -m yum -a "name=bash state=latest"
yum está bien si mis hosts son tipo RedHat, si son tipo Debian?
$ ansible all -m apt -a "name=bash state=latest"
Si la red está formada por ambos, cambio de método:
----
- name: vacuna para el ShellShock
hosts: all
sudo: yes
tasks:
- name: asegurarse de que Bash esté en la última versión en los RedHat
yum: name=bash state=latest
when: ansible_os_family == "RedHat"
- name: asegurarse de que Bash esté en la última versión en los Debian
yum: name=bash state=latest
when: ansible_os_family == "Debian"
vacuna.yaml
$ ansible-playbook -K vacuna.yaml
cloud computing
arquitectura orientada a servicios
aprovisionamiento, deploy
instalar y configurar software, base de datos, servidor web, crear usuarios y grupos
virtualización
se simula el HW para permitir correr SW, una forma de administrar recursos
Entrar por SSH host por host, parar un servicio, editar un archivo de configuración, volver a levantar el servicio. Ir acumulando un conjunto de scripts bash propios para automatizar esto.
Hay frameworks para asistir en la automatización previa, como Chef (Ruby) o Fabric (Python). Pero sigue siendo una forma imperativa.
Acá vamos ➔
def deploy():
run("cd /path/to/application")
run("./update.sh")
Framework Fabric.
En vez de llamar comandos, se define el estado deseado del sistema.
----
file dest=/etc/httpd mode=755 owner=root group=root state=directory
----
file dest=/etc/httpd state=absent
Playbooks de Ansible.
La herramienta de automatización se encarga de que el sistema alcance ese estado.
----
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
Es una capa de abstracción que aisla los detalles del "cómo" y te permite concentrar en el "qué".
El lenguaje declarativo es auditable por humanos.
Ejemplos: Puppet, Ansible, SaltStack
Lenguaje declarativo (DSL)
Definición de recursos y estado deseado
Idempotencia
Se puede aplicar muchas veces, que el resultado es el mismo.
Información del sistema
se recolectan características del sistema (facts) y se
usan como variables.
Ej: distro, procesador, hostname, IPs de las
interfaces.
Permite:
Manejar configuraciones
"Deployar" aplicaciones
Orquestar
chiquito
no requiere mucha puesta en marcha, solo depende de SSH
agentless
sin servidores, demonios ni bases de datos
arquitectura simple
fácil de usar, fácil de extender
baterías incluídas,
muchos módulos built-in que cubren la mayoría de necesidades
ingredientes: tasks, handlers, variables y facts
Python, Py2 por ahora ب_ب
2.6+ en el server, 2.4+ en los nodos
OpenSSH como transporte
Autenticación descentralizada, por credenciales.
Autenticación aconsejada es por claves SSH,
pero puede ser por contraseña.
No es requisito, se pueden usar otros transportes.
Copia scripts (por sftp o scp) al /tmp del host remoto
los ejecuta por ssh,
y los elimina al final.
/etc/ansible/hosts
[webservers]
server_uno.demo.com
server_dos.demo.com
[testers]
tester_uno.demo.com
tester_dos.demo.com
[develop]
develop.demo.com
_____________________
< OK, hagamos algo... >
---------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ ansible all --list-hosts
$ ansible dbservers --list-hosts
$ ansible blue* --list-hosts
$ ansible www???.example.com --list-hosts
Ejemplos ad-hoc
Son tareas que hacemos una sola vez, no las guardamos.
Se ejecutan en paralelo.
$ ansible all -m fetch -a "src=/var/log/boot.log dest=/tmp/logs"
Ejemplos playbook
Se ejecutan en orden.
Pueden disparar acciones al final de la corrida.
notify, handlers
Jinja para usar variables.
tanto en playbooks como en templates
$ ansible-playbook hola-mundo.yml
$ ansible-playbook -e "nombre=luli" hola-mundo2.yml
. . . . . . . . .
listo!
cc-by-sa @srmanuq
gifs: cc-by-sa @bigblueboo