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!
Deja una respuesta