formacion-ubrss-ubiquiti

[GUÍA] Automatizando nuestra red con Ansible y Mikrotik v7

[GUÍA] Automatizando nuestra red con Ansible y Mikrotik v7

La integración de Mikrotik y Ansible es una poderosa combinación para administrar redes. Al usar Ansible, los administradores de red pueden administrar rápida y fácilmente sus dispositivos Mikrotik sin tener que iniciar sesión manualmente en cada dispositivo para actualizar o reconfigurar la configuración.

En esta nueva entrada te mostraremos como instalar Ansible en un servidor Ubunbtu, como configurarlo y realizar nuestras primeras acciones de automatización utilizando Ansible y Mikrotik.

Contenido

¿Qué es Ansible?

Ansible es una plataforma de automatización de código abierto que se utiliza para simplificar el proceso de desarrollo de software y las operaciones de TI. Permite a los usuarios automatizar todo el ciclo de vida de su infraestructura, desde el aprovisionamiento y la gestión de la configuración hasta la implementación y orquestación de aplicaciones. Con Ansible, las organizaciones pueden administrar fácilmente una amplia variedad de dispositivos en entornos distribuidos, incluidos los enrutadores Mikrotik. En este artículo, discutiremos cómo se puede usar Ansible con routers Mikrotik para una administración de red eficiente.

Ansible ofrece muchas ventajas sobre los métodos tradicionales de administración de infraestructura, ya que facilita tiempos de implementación más rápidos y reduce la complejidad al eliminar los pasos manuales del flujo de trabajo. Con Ansible, los usuarios pueden implementar rápidamente aplicaciones en múltiples nodos en redes grandes sin necesidad de configurar manualmente cada dispositivo. Esto ayuda a reducir los errores humanos asociados con las configuraciones manuales que, a menudo, pueden generar costosos tiempos de inactividad o vulnerabilidades de seguridad.

Instalación de Ansible en Ubuntu.

Para esta nueva instalación, utilizaremos la distribución de Linux Ubuntu. Aquí tenemos las líneas a escribir en nuestra consola, según la guía oficial para Ubuntu:

$ sudo apt update
$ sudo apt install software-properties-common
$ sudo add-apt-repository --yes --update ppa:ansible/ansible
$ sudo apt install ansible

Al finalizar estos pasos tendremos Ansible ya instalado.

¿Cómo funciona Ansible?

Ansible funciona utilizando varios módulos integrados y archivos en formato YAML para realizar las configuraciones en los equipos de la infraestructura, esto se llama Play Books. Tendremos configurar 3 secciones:

  • Archivo de configuración general.
  • Inventario.
  • Play books.

Archivo de configuración.

Posiblemente en una nueva instalación no tendremos información en este archivo, Ansible se instala en la ruta /etc/ansible. Podremos encontrar el archivo en dicha ruta con el nombre ansible.cfg. Si nuestro archivo se encuentra vacío, podremos copiar y pegar el siguiente ejemplo ofrecido por la guía oficial de Ansible.

https://github.com/ansible/ansible/blob/stable-2.9/examples/ansible.cfg

Para este primer laboratorio vamos a descomentar las siguientes líneas del archivo:

deprecation_warnings = False

host_key_checking = False

Puedes leer sobre más configuraciones en su guía oficial: https://docs.ansible.com/ansible/latest/installation_guide/intro_configuration.html

Archivo de inventario

El archivo de inventario tiene una lista de tu infraestructura para que la gestione Ansible, aquí puedes añadir servidores, routers, switchs, etc. En esta guía nos enfocaremos en administrar routers Mikrotik. El archivo de inventario lo podremos instalar en la carpeta que hayamos seleccionado para gestionar Ansible, el archivo puede ser un simple .txt. En nuestro caso hemos creado una carpeta llamada Ansible en nuestra ruta de usuario /home/user/ansible y ahí creamos un archivo que se llama host.txt.

Si no cambiamos la ruta del inventario en el archivo de configuración, se utilizará la ruta /etc/ansible para detectar los hosts.

Añadiremos la siguiente línea a nuestro archivo de inventario:

[mikrotik]
router ansible_host=10.100.1.254

[mikrotik:vars]

ansible_connection=ansible.netcommon.network_cli
ansible_network_os=community.routeros.routeros
ansible_user=admin
ansible_ssh_pass=contraseña

En la primera línea tenemos un nombre que hemos definido como «router», pero podéis poner cualquiera, luego sigue la línea ansible_host, junto con la IP del router a administrar. Previamente, podremos observar que indica [mikrotik], esto quiere decir que las direcciones IP de los hosts que siguen a continuación se gestionaran en conjunto.

En este punto podría crear varios grupos, por ejemplo [mikrotik_fw], [mikrotik_red], etc. En donde cada grupo tendrá routers asociados, luego podremos ejecutar los playblook a determinados grupos. Veremos a que se refieren las líneas a continuación.

¿Cómo se conecta Ansible a Routers Mikrotik?

Ansible tiene la capacidad de conectarse a varios elementos de tu red por SSH, incluido nuestros routers Mikrotik, pero este último en su versión 7, añadió la función de API REST, la cual también tendremos la posibilidad de automatizar la red por medio de estos mensajes y no por SSH. En esta guía nos centraremos en la administración por SSH, para también tener compatibilidad RouterOS v6.

Para integrar Ansible con routers Mikrotik es necesario instalar una colección, Las colecciones son un formato de distribución para el contenido de Ansible. Puede empaquetar y distribuir playbooks, roles, módulos y complementos mediante colecciones. Una colección típica aborda un conjunto de casos de uso relacionados. Por ejemplo, en esta guía utilizaremos la colección community.routeros para gestionar nuestros routers Mikrotik. Ansible cuenta con un gran número de colecciones para facilitar la administración de muchos dispositivos de red. Puedes buscar las colecciones en el siguiente enlace:

https://galaxy.ansible.com/

Para instalación la colección de routerOS, ejecutaremos el siguiente comando:

ansible-galaxy collection install community.routeros

Esta colección tiene la posibilidad de trabajar por medio de API REST o CLI. Puedes leer más sobre esto:

https://galaxy.ansible.com/community/routeros

Si recordamos las últimas líneas de nuestro archivo de host, encontramos información de variables:

[mikrotik:vars]

ansible_network_os=community.routeros.routeros
ansible_connection=ansible.netcommon.network_cli
ansible_user=admin
ansible_ssh_pass=contraseña

Este bloque hace referencia al uso de la colección de routerOS, donde especifica la conexión: ansible_connection=ansible.netcommon.network_cli. Esto último nos indica que gestionará los routers por medio de SSH, en donde debemos especificar el usuario y contraseña a utilizar. También podríamos crear llaves SSH para crear una conexión segura, es recomendable eso y un usuario especial para Ansible dentro de nuestro router. Ansible puede utilizar Paramiko para la conexión SSH o una librería en Python.

Probando la conexión a nuestro router.

Ya hemos configurado el archivo de inventario e instalado la colección de RouterOS, probaremos si todo es correcto, vamos a ejecutar el siguiente comando:

ansible all -m ping

Deberíamos recibir la respuesta PONG si todo es correcto.

Creando nuestro primer Playbook

En este punto crearemos nuestro primer Playbook para Mikrotik, comenzaremos solo creando un archivo llamado mk.yaml en nuestra carpeta de trabajo con Ansible. En esta parte solo comenzaremos probando añadiendo una dirección IP a una interfaz.

---
- hosts: mikrotik

  tasks:

    - name: Añadir IP
      routeros_command:
       commands:
       - ip/address/add address=10.10.1.2/24 interface=ether2

Para ejecutar el archivo escribimos la siguiente línea por consola: ansible-playbook mk.yaml

Resultado de la tarea.

Al finalizar la tarea podremos acceder a nuestro router y verificar que contamos con una nueva dirección IP en la interfaz Ether2.

Los archivos YAML deben contar con un orden en su sentencia, si hay espacios o tabulaciones en el código, pueden arrojar un error.

Ejemplos de Playbooks

Ya hemos probado nuestra primera tarea con Ansible. Ansible nos permite automatizar y crear tareas repetitivas sin el uso de scripts en Mikrotik y sin pasar horas repitiendo comandos. Hay muchos casos de uso, pero aquí expondremos algunos más útiles.

Creando reglas de Firewall en Ansible y Mikrotik.

En el siguiente Playbook vamos a crear reglas de firewall, pero para no tener que modificar cada línea de ejecución utilizaremos variables en nuestro archivo y el uso de loops o bucles para crear varias reglas al mismo tiempo.

---
- hosts: mikrotik
  vars:
   fw:
     - name: port_80
       dst_port: 80
       src_address: 201.10.20.1
     - name: port_3306
       dst_port: 3306
       src_address: 201.10.20.1


  tasks:

    - name: Configure FW
      routeros_command:
       commands:
       - ip/firewall/filter/add chain=forward src-address="{{ item.src_address }}" protocol=tcp dst-address=10.200.1.1 dst-port="{{ item.dst_port }}" comment="Block>
      when:
       - fw is defined
      loop: "{{ fw }}"

En la primera sección de nuestro archivo vemos el término «vars:» que se refiere a las variables, que podremos añadir. En este caso solo empleamos puerto y dirección de origen, aquí podríamos añadir más datos como protocolos o interfaces y solo necesitaríamos modificar las variables, no el comando de ejecución.

La línea de ejecución hace referencia a la variable anterior:

– ip/firewall/filter/add chain=forward src-address=»{{ item.src_address }}» protocol=tcp dst-address=10.200.1.1 dst-port=»{{ item.dst_port }}» comment=»Block>

Donde en dirección de origen se indica con: {{ item.src_address }} que viene de la variable src_address definida en el bloque vars que se llama «fw».

También contamos con un bloque «when», que quiere decir que solo ejecutará esta acción si ya está definido el bloque de variables fw.

Y finalmente el loop que según la cantidad de variables, ejecutará cada una, en este caso solo creará dos reglas con el comentario «Block».

Consideraciones en la creación de reglas de Firewall con Ansible.

Cada vez que se crea una regla se va a añadir al final de la lista del Firewall, si tenemos una última línea por ejemplo con un «block» a todo el tráfico, las reglas no tendrán efecto, Ansible y Mikrotik nos ayudan en estas situaciones, ya que podremos indicar con un comentario, que añada las siguientes reglas anteriores al comentario.

La recomendación es que siempre al final de un block a todo el tráfico, según la cadena, defináis un comentario, por ej «Block Forward», luego podremos reemplazar con la siguiente línea:

- ip/firewall/filter/add chain=forward src-address=10.1.1.1 protocol=tcp dst-address=10.200.1.1 dst-port="{{ item.dst_port }}" comment="Block {{ item.dst_port }}" action=accept place-before=[/ip firewall filter find where comment="Block forward final"]

Observar la última sección: place-before=[/ip firewall filter find where comment=»Block forward»]. Aquí se indica que las cadenas se crearán anterior a la cadena que contenga ese comentario. De esta forma podremos generar y ordenar las reglas creadas con Ansible.

También tenemos la opción de crear una sola regla y trabajar con Ansible y Address-list, esto nos ayudará que la gestión sea más simple y el procesamiento de las cadenas sea más efectivo para el router.

Aplicando configuraciones de seguridad por defecto.

En muchos escenarios contamos con cientos de routers, donde necesitamos aplicar una plantilla de configuración por defecto, por ejemplo, deshabilitar los servicios de telnet, API, web. Siempre es recomendable crear varios archivos yaml para estos casos, ej: archivo_inicial.yaml, reglas_fw.yaml, etc.

Solo sería necesario crear las líneas necesarias, ej:

– ip/service/set telnet,ftp,www,api,api-ssl disabled=yes

Combinando bucles en Mikrotik

Es posible, añadir una línea de ejecución con un bucle para que los gestione directamente nuestro router, por ejemplo, si quisiésemos que se creen 100 vlans:

 - name: Configure VLANs_bucle
      routeros_command:
       commands:
       - :for e from 1 to 100 do={ /interface vlan add name="vlan-$e" interface=ether6 vlan-id=$e comment="VLAN-$e"}

Esto último crearía 100 vlans sobre la interfaz ether6, recordemos que podemos utilizar variables para no cambiar la interfaz sobre el código de ejecución.

Recomendaciones finales

Idempotencia en Ansible

En Ansible, la idempotencia se ofrece como una característica integrada en muchos de los módulos que ofrece. El término idempotencia hace referencia a una propiedad matemática que, por más que se ejecute varias veces, no cambia el resultado. En términos simples, esto significa que cuando ejecutamos cualquier tarea, se realizan los cambios requeridos en el estado del nodo de destino y más repeticiones de esta tarea en el nodo de destino no provocan ningún cambio en el estado.

Lamentablemente, el módulo de Mikrotik en Ansible no cuenta actualmente con esta característica, esto quiere decir que si ejecutamos una tarea repetidas veces, se volverán a crear nuevamente.

La solución a este escenario es utilizar una línea adicional en el código de ejecución, indicando que si ya existe la borre y luego otra línea creándola. Aquí tienes un ejemplo con un NAT:

---
## tasks para nat
- name: Masqarade
  routeros_command:
    commands:
      - /ip firewall nat remove [find where out-interface=ether2]
      - /ip firewall nat add chain=srcnat action=masquerade out-interface=ether2

Notas finales

Esperamos esta guía te haya sido de utilidad para comenzar la automatización de tu red Mikrotik con Ansible, a continuación te ofrecemos documentación adicional.

Como ya lo hemos comentado en entradas anteriores, Ansible se puede instalar vía contenedores en nuestro router, en la próxima entrada hablaremos de como hacerlo.

¡Nos vemos la próxima!

Documentación Ansible: https://docs.ansible.com/

Módulo RouteOS en Ansible: https://galaxy.ansible.com/community/routeros

Lenguaje en YAML: https://yaml.org/spec/1.2.2/

Artículos relacionados