es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Python OOP con netmiko

Usando Netmiko intento conectarme a múltiples dispositivos (routers, switches, etc.). Debido a que necesito orquestación, donde un dispositivo después del otro ejecuta comandos, intenté usar objetos.

Una vez terminado, necesito abrir conexiones a varios dispositivos y enviarles comandos para ejecutar. Al final, necesito cerrar todas las conexiones.

Entonces, aquí está mi clase:

class Switch:

    def __init__(self, hostname):
        self.hostname = hostname
        self.connection = self.connect()

    def connect(self):
        try:
            # establecer conexión
            print(f"Conectando a {self.hostname}...")
            self.connection = netmiko.ConnectHandler(ip=self.hostname, device_type=device_type, username=username,
                                                    password=password)

            # Manejar timeout, etc.
        except netmiko_exceptions as e:
            failed.append(f"{self.hostname}:{e}")
        except ValueError as v:
            failed.append(f"{self.hostname}:{v}")
        else:
            return self.connection

    def send_command(self, command):
        self.connection.send_command(command)

    def disconnect(self):
        self.connection.disconnect()

Es una buena práctica mover el establecimiento de la conexión dentro de un bloque try, sin embargo, quiero tener send_command y disconnect separados.

Cuando ejecuto el código, obtengo el error:
AttributeError: El objeto 'Switch' no tiene el atributo 'send_command'.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El error está ocurriendo porque el método send_command está intentando acceder al atributo connection del objeto Switch, el cual aún no ha sido instanciado.

    Para solucionar esto, puedes modificar el método connect para que devuelva el objeto de conexión y asignarlo al atributo connection del objeto Switch. Luego, llamar los métodos send_command y disconnect en el objeto connection.

    Así es cómo se vería la clase modificada:


    class Switch: def __init__(self, hostname): self.hostname = hostname self.connection = None def connect(self): try: # establecer conexión print(f"Conectando a {self.hostname}...") connection = netmiko.ConnectHandler(ip=self.hostname, device_type=device_type, username=username, password=password) # Manejar tiempo de espera, etc. except netmiko_exceptions as e: failed.append(f"{self.hostname}:{e}") except ValueError as v: failed.append(f"{self.hostname}:{v}") else: self.connection = connection return connection def send_command(self, command): self.connection.send_command(command) def disconnect(self): self.connection.disconnect()

    Ahora puedes crear múltiples objetos Switch, establecer conexiones con ellos usando el método connect, enviar comandos a través del método send_command, y cerrar las conexiones usando el método disconnect.

Comments are closed.