Ansible es un software que permite la configuración y gestión automática y remota de diferentes sistemas.
Como funciona?
Ansible se conectar a los nodos y, a través de los llamados módulos, ejecuta las ordenes que le indicamos en los diferentes sistemas. Gracias a estos módulos, indicando una misma orden, podemos ejecutar dicha orden en diferentes sistemas donde, si lo quisiéramos hacer de forma manual, habría sido necesario usar diferentes comandos. Por ejemplo, podemos automatizar el despliegue de un servidor web en un servidor con sistema operativo Debian y a la vez en un Centos.
Para ello, Ansible emplea SSH por lo que no es necesario instalar ningún tipo de agente en los nodos, simplemente es necesario instalarlo en la máquina desde la que vamos a lanzar las ordenes y tener acceso a los diferentes nodos sin contraseña a través de SSH.
Por aquí os dejo un enlace a su documentación pública: https://docs.ansible.com/ansible/latest/installation_guide/index.html
Para resolver la duda de ¿Como sabe Ansible donde ejecutar las ordenes que le lanzamos? Para solventar esto y no tener que indicar IP a IP o nombre de nodo a nombre de nodo, definimos un fichero de inventario. En este podemos agrupar los servidores por grupos, pudiendo tener uno genérico para todos nuestros nodos y luego subgrupos para ejecutar tareas mas concretas en algunos nodos, por ejemplo.
A lo largo de este post he repetido «lanzar ordenes» pero como hacemos esto?
Sintaxis
Para el uso de ansible podemos ejecutarlo por comandos de forma indidivual utilizando la siguiente sintaxis:
ansible servers -i /ruta/al/inventario -m shell -a 'uptime'
Siendo servers el nombre del grupo definido en el fichero de inventario, el cual especificamos con el parámetro ‘-i’. Con el parámetro ‘m’ especificamos el módulo y con ‘-a’ el comando a ejecutar. Este último varía en función de las necesidades del módulo.
Esto está bien para tareas puntuales pero que pasa cuando queremos lanzar lo mismo de forma periódica?
Para esto tenemos los playbooks. Esto son ficheros yml que permiten definir todas las ordenes a ejecutar para que en caso de que tengamos que hacer x tarea en un servidor y dentro de un tiempo tengamos que repetir dicha tarea, podamos hacerlo de forma sencilla.
Un ejemplo de este fichero sería:
- name: Esto del servidor
hosts: servers
tasks:
- name: Estado
shell: uptime
- name: Memoria
shell: free -m
Para ejecutar el yml anterior ejecutaríamos lo siguiente:
ansible-playbook -i /inventario nombrePlaybook.yml
Ejemplos
La ejecución de ordenes en ansible nos puede devolver lo siguiente:
En dicha ejecución lo que he hecho ha sido copiar un fichero llamado deploy.tar.gz en los nodos node01 y controlplane. Al final de la ejecución nos indica que han finalizado ambas transferencias correctamente. Pero que pasa si lo volvemos a ejecutar?
En ese caso indicaría que se ha ejecutado correctamente pero que ningún cambio se ha llevado a cabo
Una tarea puede ser de consulta, para comprobar, revisar o consultar algo a los nodos o bien puede ser de ejecución, para realizar algo sobre los nodos. Si ejecutamos una orden y se produce un cambio en dicho nodo, nos indicara ‘changed=1’ o ‘changed=true’. Por ejemplo, en este ejemplo solo voy a consultar que distribución es el nodo:
Se ve como al final indica:
'changed': false
Toda la información de esta guía fue sacada de la documentación pública y las pruebas fueron realizadas de unos laboratorios, los cuales dejo el enlace aquí: