Introducción

La automatización de las redes ya la tenemos aquí, Cisco lleva varios años promocionando sus productos «programables». Incluso han creado una página para la comunidad de desarrolladores llamada DevNet.

Los nuevos productos que están lanzando tienden a incorporar una REST API para poder interactuar con ella y animan hacerlo en  Python.
Adicionalmente también están ofreciendo nuevas certificaciones de «programación de redes»

 

Y qué hacemos si queremos subirnos al carro de la automatización? Una opción sería sustituir todo el hardware «obsoleto»  por las nuevas gamas que recomienda Cisco.

Y si podemos aprovecharlo?

Ansible

Para los que no conozcais Ansible, es una herramienta de orquestación para poder administrar los equipos de forma remota. Pudiendo crear playbooks/roles con todas las configuraciones que nosotros creamos oportunas, es decir, el trabajo solo lo realizamos una vez creando el playbook, una vez lo tengamos testado y probado podemos desplegarlo en el resto de equipo en cuestión de minutos.

En la propia página de Ansible encontramos soporte para las versiones de IOS de Cisco.

 

GNS3

Para poder emular un router Cisco he utilizado GNS3, lo que sí necesitamos es tener la imagen IOS del router. Os dejo hacer volar vuestra imaginación para encontrarla.

La versión de GNS3 que tenemos en los repositorios de ubuntu es muy antigua, así que utilizaremos los repositorios de GNS3:

add-apt-repository ppa:gns3/ppa
apt-get update && sudo apt-get install gns3-gui

Una vez instalado os dejo un par de pantallazos como añadir un nuevo router:

En este paso tenemos que seleccionar «Create a new version» y a continuación import:

 

 

 

 

 

 

Una vez tengamos el router configurado, el siguiente paso es poder crear una red entre nuestro PC y el router que hemos creado anteriormente.

Para ello, yo soy partidario de crear una interfaz tap temporal en la maquina donde tengo instalado ansible:

ip tuntap add tap0 mode tap
ip link set dev tap0 up
ifconfig tap0 10.10.10.1/29

Ifconfig nos tendría que devolver el siguiente resultado:

~$ ifconfig tap0
tap0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.10.10.1  netmask 255.255.255.248  broadcast 10.10.10.7
        ether fa:71:59:7d:a5:1b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Ahora si creamos un objeto del tipo cloud y intentamos conectar el router con el objeto cloud veremos que nos aparece la interfaz tap0:

Si os da problemas para realizar esta conexión, cerrar GNS3 y abrirlo via terminal con permisos de root:

sudo gns3

Cisco

Lo primero que haremos es conectarnos al router, para ello nos quedamos con el número de puerto que aparece al pasar el mouse por encima del objeto:

 

Ahora lanzamos un telnet a dicho puerto:

 $ telnet localhost 5001
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connected to Dynamips VM "Cisco7200720015-1" (ID 1, type c7200) - Console port
Press ENTER to get the prompt.
aragraph
(c) (1) (ii) of the Rights in Technical Data and Computer
Software clause at DFARS sec. 252.227-7013.

Aplicamos la siguiente configuración básica para tener acceso al router:

conf t

username cisco privilege 15 password SDKJFGsigy8ey65y5eygerhb
line vty 0 4
login local 

interface FastEthernet0/0
no shut
ip address 10.10.10.2 255.255.255.248
no shut

 

Ahora vía GNS3 conectamos los dos equipos con un cable de red virtual:

F0/0 -> tap0

Probamos de lanzar un ping desde nuestro PC al router para confirmar que tenemos conectividad:

$ ping 10.10.10.2
PING 10.10.10.2 (10.10.10.2) 56(84) bytes of data.
64 bytes from 10.10.10.2: icmp_seq=1 ttl=255 time=10.0 ms

Ansible

Para instalar ansible lo podemos hacer de diferentes métodos como bien comentan en la web oficial,  yo he optado por instalar el repositorio de Ansible y instalarlo via apt:

/etc/apt/sources.list
deb http://ppa.launchpad.net/ansible/ansible/ubuntu trusty main
apt-get update && apt-get install ansible

Añadimos el equipo al inventory  especificando su usuario, password y IP:

/etc/ansible/hosts
[routers]
ROUTER01 ansible_host=10.10.10.2 ansible_user=cisco ansible_ssh_pass=SDKJFGsigy8ey65y5eygerhb ansible_network_os=ios

Empezaremos con el rol de backup que lo podeis descargar de mi github. La estructura de directorios/fichero tendría que quedar así:

mkdir /etc/ansible/roles
$ ls -liath /etc/ansible/roles/cisco-backup/* 
/etc/ansible/roles/cisco-backup/tasks: 
total 12K 
15990851 --------- 2 root root 4,0K ene 16 20:53 . 
15990849 --------- 4 root root 4,0K ene 16 20:48 .. 
15990852 --------- 1 root root  124 oct  8 22:49 main.yml 

Creamos el siguiente playbook para ejecutar el rol anterior (el lenguaje yaml es case sensitive con los espacios):

/etc/ansible/routers.yml 
---
- hosts: routers
   connection: network_cli
   become: yes
   become_method: yes
   roles:
       - cisco-backup

Ejecutamos el playbook:

/etc/ansible$ ansible-playbook routers.yml

PLAY [routers] ********************************************************************************************************************************************

TASK [Gathering Facts] ************************************************************************************************************************************
ok: [ROUTER01]

TASK [cisco-backup : Backup configuration] ****************************************************************************************************************
ok: [ROUTER01]

PLAY RECAP ************************************************************************************************************************************************
ROUTER01 : ok=2 changed=0 unreachable=0 failed=0

El backup nos lo habrá guardado en el directorio donde tengamos el role:

ls -liath /etc/ansible/roles/cisco-backup/backup/ROUTER01_config.2019-01-16@20\:48\:32

Este último playbook configura el SNMP, NTP, encriptado de passwords, deshabilita la gestión web,etc.. Lo he realizado utilizando alguna de las «best practice» del team cymru:

/etc/ansible/routers.yml 
---
- hosts: routers
   connection: network_cli
   become: yes
   become_method: yes
   roles:
       - { role:  cisco-minimal-router, ntp_server: 52.166.120.77, comunity_server: TesT10 }
$ ansible-playbook /etc/ansible/routers.yml

PLAY [routers] ********************************************************************************************************************************************
....
PLAY RECAP ************************************************************************************************************************************************
ROUTER01 : ok=13 changed=10 unreachable=0 failed=0

 

Conclusiones

Los módulos que dispone Ansible para poder administrar GNU/Linux son mucho más potentes que los que tenemos para Cisco. Aun así podemos realizar playbooks  interesantes.

Adicionalmente es aconsejable  empezar a mirar Python. Por ejemplo, en los nuevos FirePower no disponemos de la típica CLI de los ASA, así que para poder crear masivamente objetos tenemos que utilizar la API que nos proporciona Cisco.

Estas REST API también se encuentran incorporadas en algunas gamas de Catalyst y de Nexus.

Todos a programar!