Python SSH İle Ağ Cihazlarına Toplu Config Yollama (Configure Network Devices With Python SSH)
CLI Guru - Cisco Eğitim ve Danışmanlık Merkezi |

2007 yılından bu yana aktif olan ciscotr.com, kısa bir süre sonra " www.bilisim.pro " olarak devam edecektir.  
Mevcut mesajlarınız ve kullanıcı bilgilerinizle yenilenen sitemizde katılıma devam edebileceksiniz.

+ Konuyu Cevapla
Toplam 2 sonuçtan 1 ile 2 arasındakiler gösteriliyor.
Like Tree1Likes
  • 1 Post By root
Python SSH İle Ağ Cihazlarına Toplu Config Yollama (Configure 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

  1. #1
    Nexus isimli Üye şimdilik offline konumundadır Administrator - Founder
    Üyelik tarihi
    May 2012
    Mesajlar
    1,995

    Standart Python SSH İle Ağ Cihazlarına Toplu Config Yollama (Configure 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 yazılmış script yardımıyla 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 5x100=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
    Sonrada 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/user/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()

    Yukardaki 50 satırlık script işimizi görecektir. Ama burada bir cihaz hata verirse uygulama çöker. Bunun önüne geçmek içinde işlemi try döngüsü içerisine alarak, except ile olası hataları bir hata dosyasına (Örn: hata_log.txt) kaydedip döngüyü bağlantı hatalarına rağmen sonuçlandırabiliriz.

    Bu tarz uygulamaları network alanında kullanmanız iş yükünüzü hafifletir. Kendinize bir şeyler katmak için daha fazla zaman bulursunuz. Özellikle Qos ve güvenlik gibi kurumsal policy'lerinizi bir dosyada sürekli güncelleyip otomatik olarak tüm cihazlarınıza uygulayabilirsiniz. Veya bir cihazınızı tüm ağ cihazlarına referans olacak şekilde kullanabilirsiniz. Oradaki QOs ve güvenlik konusunda uyguladığınız policy'leri otomatik olarak ağdaki tüm cihazlara otomatik uygulayabilirsiniz. Sonuçta burada her şey sizin elinizde ve hayal gücünüzün sınırları içerisinde.


    Bu tarz yazıları ülkemizde bilişim sektöründe çalışan insanlar için yazıyorum ama neden yazıyorum ondan bahsedeyim. Ülkemizin kendini geliştirmiş nitelikli insanlara çok ihtiyacı olduğunu düşünüyorum. Daha araştırmacı, daha yenilikçi, daha üretken insanlar bu makalelerde bir şeyler öğrensin ve kendisine daha fazla zaman ayırsın istiyorum. Ama bu tarz şeyleri hazır burdan alayım zaman kazanayımda daha fazla yatayım keyfime bakayım olarak düşünen insanlara da birşey demiyorum. Yatmaktan başka bir şeye yaramadıklarını bilmelerini istiyorum.

    Başka bir olaydan da bahsedeyim. Python tabanlı bir network tool daha tasarlıyorum. Bu tool ile cisco komutları girerek hp, huawei gibi cihazları yapılandırabiliyoruz. İlaveten bazı uygulamaları ve ayarları tek komutla başlatabiliyorsunuz. Burada kullanıcıya sadece spesifik değerleri soruyor. (parola veya hangi arayüze uygulansın vs gibi .) Yani bir nevi aktif translator oldu. Zaman buldukça üzerinde çalışmaya devam ediyorum.

    Son olarak; ben burada lib olarak paramiko kullandım. Bu işlem subprocess veya threading kullanarak da daha profesyonel bir şekilde de yapılabilir.

    Konu altında sorularınızı sorabilirsiniz. Herkese iyi günler diliyorum.


    Murat KAYAPINAR
    Net & Sys Admin
    Software Developer
    “Bir kez kaçar uçurtman, sonra gökyüzüne küser insan…”

  2. #2
    root isimli Üye şimdilik offline konumundadır Moderator
    Üyelik tarihi
    Jun 2007
    Bulunduğu yer
    Ankara
    Mesajlar
    1,409

    Standart

    Hocam çok güzel bir paylaşım olmuş ve oldukça faydalı. Eline emeğine sağlık. Paylaşım için teşekkürler.
    Nexus likes this.

+ Konuyu Cevapla

Bu Konuyu Paylaşın !

Bu Konuyu Paylaşın !

Yetkileriniz

  • Konu Acma Yetkiniz Yok
  • Cevap Yazma Yetkiniz Yok
  • Eklenti Yükleme Yetkiniz Yok
  • Mesajınızı Değiştirme Yetkiniz Yok