#Programación #Automatización Entornos de RED.
¿Tiene un beneficio usar la programación cuando se gestiona una red?
Sí muchos, la programación hoy en día es cada vez más fácil iniciarse y aprender de forma autodidacta. Lenguajes como Python hace posible el inicio y sobre todo tener una fuerte progresión si queremos aprender y alcanzar un nivel lo suficientemente fuerte que nos permita usarlo con naturalidad en tareas cotidiana del trabajo y sacar el máximo partido. Un ejemplo sería extraer información de equipos, aplicar configuraciones, backup automatizados, alertas en cambios de routing... Es útil en muchos aspectos y nos permite también crear tareas periódicas que extrae información ya sea para localizar un dato o guardarlo para un análisis posterior y sobre todo cuando empieza haber un gran volumen de datos. Iniciar un programa no siempre es empezar desde cero, hay infinidades de librería disponibles que se pueden descargar a nuestro proyecto ya sea para buscar la información en equipos, modificarlos, almacenarlos y analizarlos.
Siempre hablamos de la famosa curva sobre el tiempo empleado que dedicamos al escribir el código y el tiempo si hacemos la tarea de forma manual. Estamos añadiendo un paso más por lo cual hacer un código siempre requiere tiempo adicional en función de la complejidad. Pero es también cierto que se desarrolla una habilidad mi punto de vista es donde realmente estamos invirtiendo. Al arrancar parece siempre complicado porque hay que documentarse tener una estructura clara desde el inicio hasta el final. Pero al adoptar buenas metodologías desde el principio en la etapa de aprendizaje veremos como al final jugará a nuestro favor. Hoy en día existe muchas formas, podemos buscar una librería que nos pueda facilitar la obtención de nuestro propósito y para ellos normalmente tienen su página de documentación como proyecto. Por otro lado también están saliendo herramientas de AI (Inteligencia Artificial) no siempre será la opción para encontrar soluciones pero nos puede ayudar a generar un código base que después podemos personalizar o mejorar. Rápidamente en la curva de evolución nos daremos cuenta sobre adquirir buenos principios como estructurar bien el código, hacerlo modular en forma de librería, usando métodos porque todas estas técnicas no será extremadamente útil al reaprovechar nuestro código en diferentes tareas donde pueda sernos útil. Nunca perder tiempo cuando ya existe una librería que podemos incorporar para nuestro propósito. Existe infinidades de librerías disponibles en Python para infinidades de propósitos. Descargarlas con las herramientas específicas de librerías es extremadamente fácil y usarlos en el nuestro código siguiente las instrucciones que propone el propio proyecto para arrancar rápidamente (QuickStart).
¿Qué dirección tomar, un código más personalizado o adaptarse a herramientas?
Todo depende del objetivo que queramos tener y la complejidad del resultado que buscamos. Si queremos sacar más rendimiento podremos traspasar la lógica a nuestro código Python usando las herramientas como NAPALM, NETMIKO, SCRAPLI o adaptarnos a herramientas que sean más de orquestación como ANSIBLE. Existe un punto intermedio como NORNIR al ser un framework hecho en Python podemos usar las ventajas del lanzador de tareas y gestión de inventario así como aprovechar la posibilidad de crear nuestras propias funciones que serán lanzados por el gestor de tareas.
El punto común que tienen estas herramientas de Python es que están hechas con el objetivo de acelerar el desarrollo del código y hacer foco en la configuración o obtención de datos.
No existen estándares en la industria. Cada librería tiene sus ventajas y desventajas, ya sea trabajar con controladores específicos para equipos determinados o utilizar controladores genéricos. Este punto condiciona en gran medida, especialmente si utilizamos controladores específicos. Ahí es donde entra en juego la compatibilidad de nuestro equipo, ya que podemos aprovechar los métodos incorporadas en las librerías para acelerar enormemente el desarrollo del código al usarlos. Estos métodos predefinidos gestionan desde la conexión hasta los parámetros de la terminal. Además, al tratarse de modelos basados en YANG, incluso la información obtenida se estructura de manera más organizada.
Las herramientas para estructurar datos son (TEXTFSM, TTP, Genie...) y son usado por las diferentes librerías. Cuando trabajamos con un controlador específico y diseñado para el equipo que vamos a interactuar y si usa el modelo YANG (estándar de la ietf o propietario del equipo) algunos no necesitan que el usuario-desarrollador tenga que escribir las plantillas para especificar los datos que buscamos.
Una buena elección será desde el principio escoger donde residirá nuestra lógica:
Cuando se trata de automatizar tareas en redes, existen diferentes enfoques que se pueden adoptar según las necesidades y los objetivos específicos. Dos opciones comunes son utilizar herramientas de orquestación como Ansible o desarrollar una solución personalizada utilizando código y librerías de Python (NORMIR es un buen candidato porque puede integrar como plugin las librería NETMIKO, SCRAPLI, NAPALM) obteniendo así mayor flexibilidad para crear muestras funciones.
Proyecto más grande requerirá una interfaz para usuario.
Cuando se trata de proyecto un poco más grande y requieran más funcionalidades se puede incluir una interfaz gráfica. Pasamos de un script a un APP, en este caso la arquitectura cambia y tendremos la parte de "Backend" y "Frontend". En la parte de Backend las reservaremos para la parte de la lógica y CORE de nuestra aplicación (todo los accesos a los equipo de de red y orquestación de configuración son lanzados desde backend) en cambio en el Frontend se nos abre muchos frentes de tecnologías (css, javascript, jquery, framwork de estilos como Bootstrap) que se pueden usar. Usar una APP WEB ganamos muchas ventanas respecto a una aplicación convencional de un sistema operativo porque tendremos facilidad para distribuirlo y actualizarlo. Todos la lógica añadida, actualizaciones o mejoras quedarán en un único punto de control facilitando así que todos los usuarios puedan usar exactamente con los últimos objetivos de diseño.
Para crear aplicaciones se puede usar Frameworks que nos ayudarán en el proceso, hacer uso de plantillas, nos ayuda a no repetir tanto el código. Python tienes varios por Ejemplo Flask y Tornado. Flask y Tornado son dos Framework fáciles de usar y muy flexibles, requiere un poco más de experiencia en linux , para la puesta en marcha. La arquitectura también es muy importante y requerirá una reflexión antes de lanzarnos y escoger los componentes. Por ejemplo Tornado está creado para hacer aplicaciones "None-Blocking I/O" Esto quiere decir que podremos lanzar tareas en paralelo y no bloqueamos el uso de la CPU para nuevas tareas entrantes. En Cambio Flask no puede gestionar tareas concurrentes pero existe más librerías para Flask que aceleraran el proceso de manejo de datos como SQL incorporando librería tipo ORM, Autenticación en la APP, etc,..
Frameworks para Python:
* Existen muchos más y se puede consultar en este enlace:
https://elblogpython.com/frameworks-python/
*1: Tornado al ser un framework asíncrono NO es especialmente bueno para soportar RDBMS, pero se puede conseguir usando extensiones de terceros como por ejemplo aiopg (Para PostgresSQL).
Una implementación con Interfaz gráfica nos obligará a tener en cuenta aquellas técnicas que permite hacer que una APP-WEB sea más vulnerable y en función del entorno donde estará prestando servicio habrá que considerar los mecanismo de protección.
Non I/O Bloquing: En un único "Tread" (Hilo) recibe peticiones de entrada y salida de datos sin que este quede bloqueado, la ejecución de cada petición por parte del cliente es gestionado en segundo plano en el servidor. El servidor puede gestionar peticiones de forma concurrente.
Tornado respecto a Flask tiene esta ventaja, utiliza un bucle de eventos para escuchar continuamente peticiones y llama a los manipuladores de eventos(funciones de Python) correspondientes cuando ocurren. Concretamente IOLOOP es la librería que se encarga de registrar los manipuladores de eventos.
Soporte RDBMS: Relational Databse Managment System, se refiere a la capacidad de una aplicación o sistema para trabajar con un sistema de gestión de bases de datos relacionales. Esto puede incluir la capacidad de conectarse a una base de datos RDBMS, enviar consultas a la base de datos y procesar los resultados de esas consultas, y realizar otras operaciones de gestión de datos como insertar, actualizar o eliminar datos de la base de datos. Ejemplo de RDBMS: MySQL, PostgreSQL, Oracle...
Seguridad:
CSRF: Cross-Site-Request-Forgery Es una vulnerabilidad web que permite un atacante inducir un usuario a realizar acciones no deseadas cuando este visita un sitio malicioso. (Aprovechan la autenticación de una web limpia que el usuario ha usado previamente para hacer un cambio en su nombre) Flask por ejemplo cuando se crea una aplicación se especifica una "secret_key" que será usado para firmar. Mediante una extensión se puede también añadir otra llave para usarlo en los formularios.
XSS: Cross-Site-Scripting es también un vulnerabilidad web que permite una atacante infectar una web y la siguientes visitas de otros usuarios este código malicioso es ejecutado. Para protegerse si usamos NGNIX como proxy inverso la medida de seguridad se añade en el encabezado. (Es lo aconsejable) o se puede añadir en Flask, al final es otro decorador que se añade en todas las rutas. A nivel de código cuando usamos Jinja hay que usar siempre las comillas para escapar correctamente de HTML.
JSON: Ya no afecta en la nueva normalización ECMAScript5 (Es la base que tiene varios lenguajes de programación como Javascript, jscript. Es una nomenclatura) En su versión4 estaba afectada. Era debido porque en Python hay una función que es jsonify() para devolver una lista diccionario como una respuesta JSON. Solo acepta una lista objeto antes de serializar. Ya no existe esta afectación.
Enlace interesante para temas de seguridad en Flask:
https://flask-security-too.readthedocs.io/en/stable/index.html
Tipo Framework: Micro Framework usado para pequeñas aplicaciones Flask entra en este categoría fácil implementación y existe muchas extensiones para añadir funcionalidades. Framework asíncrono en cambio se caracteriza por gestionar un gran número de conexiones simultáneas.
Por lo general en aplicaciones web la arquitectura es FULL-STACK (Backend-Midellware-Frontend).A todo esto, empezamos a entrar en la arquitectura de software. Resulta importante desde el inicio tener un plan de arquitectura y también a modo pruebas de concepto probar cada parte para asegurarnos que una vez en conjunción la aplicación funcione de forma esperada.
Cuando tratamos con código que accede equipos de red para consultas o modificaciones en equipos de red la clave está en tener claro que queremos obtener y que lenguaje usaremos para saber como se ejecutará nuestro código, en que tipo de plataforma, que tipo de tareas para así saber también como planificar el uso de la tecnología. Un ejemplo sería si lanzaremos muchas tareas y si requiere un cierto tiempo de ejecución. Este simple hecho condiciona enormemente el tipo de arquitectura que tendremos que usar. Para aquellas tareas ejecutadas y no son inmediatas son tareas asíncronas. A diferencia de las tareas síncronas que obtenemos de forma inmediata el resultado para las asíncronas las tendremos gestionar de forma diferente. En primer lugar se tiene que poner en una cola, gestionarlos, obtener su resultado y finalmente de forma opcional si se trata de una APP WEB llevar el resultado a la parte gráfica para ellos usamos un canal bidireccional entre el "Backend" y el "FrontEnd" para este tipo de mensajería de avisos o notificaciones si las queremos en tiempo real.
Empezamos a tener una arquitectura compleja la pieza clave es saber evaluar bien que objetivo queremos para escoger los Framewroks correctos.
Existen mucho Framework de Python que en función de las necesitas podemos escoger una arquitectura que mejor se adapte.

Comentarios
Publicar un comentario