Ansible - Primer Contacto

Publicado por Marcelo Freri el 3/2/2023

Supongamos que tenemos una red con diez servidores y necesitamos instalar un nuevo paquete en ellos. Normalmente, tendríamos que conectarnos a esos equipos, uno por uno, y realizar la instalación. Ahora bien, ¿y si en lugar de diez fuesen cien? ¿Y si fuesen 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.

Enlaces De Utilidad