Python SSH İle Ağ Cihazlarına Toplu Config Yollama (Configure Multiple Network Devices With Python SSH)
Merhabalar bu makalemde Python ile ağ cihazları yönetimine yönelik ufak scriptler hazırlamayı ele aldım. Her işletmede sorun olan toplu konfigürasyon yapmayı nasıl daha kolay ve merkezi yapabilirim gibi sorularınıza yanıt olabilecek bu makale çalışmalarınız için bir basamak olabilir.
Öncelikle Python’da cihazlara SSH ile bağlanmamız gerekiyor. Bunu ise Paramiko isimli Python kütüphanesini kullanarak yapıyoruz.
Örnek class aşağıdaki gibidir:
Kod:
# -*- coding: utf-8 -*- import paramiko __author__ = 'Nexus' class SSHConnect(object): def __init__(self, host, uname, passwd): self.host = host self.uname = uname self.passwd = passwd self.devclient = paramiko.SSHClient() self.devclient.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.devclient.connect(host, username=uname, password=passwd) def runCommand(self, cmd): self.devclient.invoke_shell() stdin, stdout, stderr = self.devclient.exec_command(cmd) return stdout.readline() def closeConnection(self): self.devclient.close()
Bu arada SSHConnect’i kullanarak cihazlara SSH ile login olabilir ve komut yollayabiliriz. Bu işlemi gösteren basit bir uygulama aşağıdaki gibidir:
Kod:
cmd="uptime" # -----> Her hangi bir komut olabilir.. veya cmd=input(">>>") # ------> Bu kullanım şekli ile de birkaç ekleme ile interaktif shell'de yapabilirsiniz. con = SSHConnect("ip", "username", "password") #--> Örn: SSHConnect("10.10.10.1","usr","parola123") cli = con.runCommand(cmd) con.closeConnection() for value in cli: print value
Yukarıdaki örnekte 10.10.10.1 ip adresli cihaza login olduk ve “up time” komutunu çalıştırdık. Bu işlemi 100 kadet veya 1000 adet cihaza uygulamız gerektiğini düşünelim. Hepsine tek tek bağlanıp yapılandırma girsek ne kadar zamanımızı alır? Her birisi en iyi ihtimalle 5 dakika zaman alsa, 100 adet cihaza bu komutu yollamak 5×100=500 dk, yani neredeyse 10 saat zaman alacak.
Bu işlemi 1 dakikada yapmak mümkün ve uygulaması bir o kadar kolaydır. Bu makalede seçtiğim yapılandırma ağ cihazlarının parolasını değiştirmek olsun. Başlamadan önce ağda yapılandırma yollayacağımız tüm cihazlarımızın ip adreslerini bilmemiz gerekiyor. Tüm ip adreslerimizi ip_adresleri.txt dosyasında sakladığımızı düşünelim. Sonra cihazlara şifre değiştirmek için gerekli olan aşağıdaki komutları yollayalım.
Kod:
configure terminal usename admin privilege level 15 password yeniparola do wr
Sonra da işlemimizin sonuçunu aşağıdaki komutla alarak sonuçları bir log dosyasına yazarak kayıtlandıralım :
Kod:
do show run | include username
Yukarıdaki anlatıklarımı yapan kısa uygulama aşağıdaki gibi olacaktır:
Kod:
# -*- coding: utf-8 -*- import paramiko import os __author__ = 'Nexus' ########### SSH CLASS'ın oluşturulması############## class SSHConnect(object): def __init__(self, host, uname, passwd): self.host = host self.uname = uname self.passwd = passwd self.devclient = paramiko.SSHClient() self.devclient.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.devclient.connect(host, username=uname, password=passwd) def runCommand(self, cmd): self.devclient.invoke_shell() stdin, stdout, stderr = self.devclient.exec_command(cmd) return stdout.readline() def closeConnection(self): self.devclient.close() ########### Yollanacak komutların Oluşturulması ############## cmd1="conf t" cmd2="username admin privilege 15 pass yeniparola" cmd3="do wr" cmd4="do show run | include username" ####### LOG DOSYASININ OLUŞTURUP YETKİLENDİRİLMESİ ########## os.system("touch /home/user/log.txt") os.system ("chmod +x /home/user/log.txt") ########### Komutların Toplu Olarak Yollanması ve Log######## with open ("/home/murat/ip_adresler.txt") as cihaz_f: cihazlar=cihaz_f.readlines() cihaz_f.close() for line in cihazlar: ip=line.rstrip() print ip+" ip adresli cihaza config uygulanıyor....:" con = SSHConnect(ip, "admin", "eski parola") cli1 = con.runCommand(cmd1) cli2 = con.runCommand(cmd2) cli3 = con.runCommand(cmd3) cli4 = con.runCommand(cmd4) con.closeConnection() log_dosya = open("/home/user/log.txt" ,"w") log_dosya.write(ip + " adresli cihazın yeni parolası : \'"+ cli4 + "\' ) log_dosya.close()
Murat KAYAPINAR
Net & Sys Admin
Software Developer
Hocam komutu nasıl kullanıcam python çok bilmediğim için anlamadım..
biraz anlatabilirmisiniz.
direk kopyala yapıştır dedim komutu çlaışmadı ?
Merhaba, paramiko modülü yüklü değilse çalışmaz.