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'
.
davy.ai
El error está ocurriendo porque el método
send_command
está intentando acceder al atributoconnection
del objetoSwitch
, 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 atributoconnection
del objetoSwitch
. Luego, llamar los métodossend_command
ydisconnect
en el objetoconnection
.Así es cómo se vería la clase modificada:
Ahora puedes crear múltiples objetos
Switch
, establecer conexiones con ellos usando el métodoconnect
, enviar comandos a través del métodosend_command
, y cerrar las conexiones usando el métododisconnect
.