Supongamos que tenemos una red con diez computadores y necesitamos instalar o actualizar una aplicación en cada uno de ellos. Normalmente, tendríamos que acceder a cada uno de esos equipos, de forma presencial o remota, y realizar la instalación. Ahora bien, ¿y si en lugar de diez computadores fueran cien? ¿Y si fueran mil? Es aquí donde entra Ansible.
¿Qué es Ansible?
Ansible es una herramienta de automatización de tareas de mantenimiento de sistemas. Permite instalar, configurar y desinstalar aplicaciones de manera sencilla, sin importar el tamaño de la red ni la cantidad de servidores que la integran.
Características
- Ansible no necesita instalar clientes ya que usa las características propias de Linux.
- Utiliza OpenSSH para conectarse a los hosts, lo que mejora la seguridad y solidez de los procesos.
- No depende de un servidor central, por lo que se puede manejar desde cualquier equipo de la red, en tanto cuente con las credenciales y los playbooks.
- Trabaja con módulos que realizan acciones específicas.
- Es de código abierto.
Instalación
1$ sudo apt install ansible ansible-core
Guía de Uso
Ansible funciona con dos grupos de archivos a tener en cuenta: los inventarios de equipos y los playbooks.
Inventario de Equipos
Son archivos que contienen una lista de equipos de la red. Su formato es el siguiente:
1[nombre_grupo]
2nombre_host ansible_host=dirección_ip
Ejemplo de inventario
Definir un grupo de servidores de archivos llamado samba, que incluya el servidor de contabilidad y el de sueldos.
1[samba]
2contabilidad ansible_host=192.168.1.101
3sueldos ansible_host=192.168.1.113
Variables
Soportan el uso de variables, pero estas deben ser definidas en un subgrupo. En este ejemplo, las variables sólo aplicarán para el grupo samba.
1[samba:vars]
2ansible_user=mi_usuario
3ansible_password=mi_clave_segura
Playbooks
Son archivos en formato YAML y contienen la lista de tareas a realizar en los hosts.
Formato Básico
1---
2- name: Descripción corta de las tareas
3 hosts: grupos_afectados
4 remote_user: nombre_usuario
5
6 tasks:
7 - name:Descripción de la tarea
8 módulo_ansible_usado:
9 name: servicio o paquete
10 state: acción a realizar
Comentarios
Los comentarios se realizan anteponiendo un #
al texto comentado.
1# Esto es un comentario
Variables
Al igual que los inventarios, los playbooks soportan el uso de variables. Estas se definen utilizando el método vars.
1vars:
2 nombre_variable: valor
Para acceder al contenido de una variable se utiliza su nombre entre dobles llaves.
1{{ nombre_variable }}
Ejemplo de playbook
Actualizar los repositorios del grupo “Oficina”:
1---
2- name: Actualizar
3 hosts: Oficina
4 tasks:
5 - name: Actualizar repositorios
6 ansible.builtin.apt:
7 update_cache: true
8 become: true #Ejecutar la tarea como superusuario
Interdependencia de Tareas
Se pueden indicar tareas auxiliares que serán disparadas dependiendo del resultado de otras. Este tipo de tareas son llamadas handlers.
Ejemplos de handlers
En el siguiente ejemplo se instala Apache HTTP Server y, si la tarea resulta exitosa, se dispara el handler que inicia el servicio. Si la tarea fallase, Ansible no intentará iniciar Apache HTTP Server.
1---
2- hosts: all
3 remote_user: mi_usuario
4 become: true
5
6 tasks:
7 - name: Instala Apache2
8 apt: name=apache2 state=present update_cache=true
9 notify:
10 - "Inicia Apache"
11
12 handlers:
13 - name: Inicia Apache
14 service: name=apache2 state=restarted
Actualizar repositorios y luego, actualizar paquetes, del grupo “Oficina”:
1---
2- name: Actualizar
3 hosts: Oficina
4
5 tasks:
6 - name: Actualizar repositorios
7 become: true
8 ansible.builtin.apt:
9 update_cache: true
10 notify:
11 - Actualizar paquetes
12
13 handlers:
14 - name: Actualizar paquetes
15 ansible.builtin.apt:
16 upgrade: "yes"
17 become: true
Línea de Comandos
Estas son algunas de las tareas más comunes de Ansible, lanzadas desde la línea de comandos.
Comprobar que un host se encuentre en línea:
1$ ansible -i archivo_hots {grupo | nombre | dirección_ip} -m ping
Ejecutar un comando remoto:
1ansible -i archivo_hots {grupo | nombre | dirección_ip} -a comando
Ejecutar un comando remoto como root:
1ansible -i archivo_hots {grupo | nombre | dirección_ip} -b -K -a comando
Ejecutar un playbook:
1$ ansible-playbook -i archivo_hots archivo_yaml
Utilizar los comandos remotos para actualizan los paquetes del grupo de hosts “oficina”:
1$ ansible -i ~/.ansible/hosts "oficina" -b -K -a "apt update & apt -y upgrade"
Posibilidades de Uso
Podemos tener definido un grupo con una única máquina virtual destinada a pruebas (grupo de pruebas) y allí testear nuestro playbook. Haremos los ajustes necesarios y, cuando estemos conformes, cambiamos el nombre del grupo en el playbook (de grupo de pruebas al grupo de los servidores de producción) y volveremos a correr los procesos, esta vez sobre los equipos de producción.
Conclusión
Ansible permite automatizar tareas de administración de sistemas de forma eficiente y realizarlas en menos tiempo del que normalmente consumirían.