Python temelleri serimizin büyük finaline geldik. Değişkenleri tanımlamayı, döngülerle veriler üzerinde gezinmeyi, koşullarla karar vermeyi, fonksiyonlarla modülerleşmeyi ve try-except bloklarıyla kırılmaz kodlar (robust code) yazmayı öğrendik.
Şimdi, bir sistem ve ağ yöneticisinin günlük operasyonlarını kolaylaştıracak gerçek bir senaryo kurgulayacağız. Bu projede, öğrendiğimiz tüm yapı taşlarını birleştirerek dış dünyadan (REST API) veri çekecek, elde ettiğimiz bu verilerle ağ cihazlarımıza (Cisco Switch/Router) bağlanacak ve sonuçları kalıcı bir log dosyasına yazdıracağız.
Dış Dünyaya Açılmak: Gerekli Kütüphanelerin Kurulumu
Python'ın standart kütüphaneleri (built-in) çok güçlüdür ancak ağ otomasyonu gibi spesifik işlemler için topluluk tarafından yazılmış 3. parti modüllere ihtiyaç duyarız. Terminal veya Komut İstemcisi (CMD) üzerinden Python'ın paket yöneticisi olan pip'i kullanarak iki hayati kütüphane kuracağız:
# REST API'ler ile haberleşmek (HTTP istekleri atmak) için:
pip install requests
# Ağ cihazlarına (Cisco, Fortinet vb.) SSH üzerinden güvenli bağlanmak için:
pip install netmikoSenaryo Adım 1: REST API Üzerinden Veri Çekme (Requests Kullanımı)
Modern ağ mimarilerinde (SD-WAN, Cisco DNA Center vb.) cihazlar ve sunucular birbiriyle REST API üzerinden, çoğunlukla JSON formatında haberleşir. JSON formatı, Bölüm 3'te öğrendiğimiz Python "Sözlükleri (Dictionary)" ile birebir aynı mantıkta çalışır.
Aşağıdaki fonksiyonda, sahte bir API üzerinden ağımızdaki aktif switch'lerin IP adreslerini dinamik olarak çektiğimizi simüle ediyoruz:
import requests
def aktif_cihazlari_getir():
# Bu örnekte JSON Placeholder isimli ücretsiz test API'sini kullanıyoruz.
api_url = "https://jsonplaceholder.typicode.com/users"
try:
print("[*] API'ye bağlanılıyor ve veri çekiliyor...")
yanit = requests.get(api_url, timeout=5)
# Eğer HTTP kodu 200 (Başarılı) dönerse işlemi yap
if yanit.status_code == 200:
kullanici_verisi = yanit.json() # Gelen JSON'ı Python sözlüğüne çevirir
cihaz_ipleri = []
# Sadece ilk 3 veriyi IP formatıymış gibi listemize ekleyelim
for cihaz in kullanici_verisi[:3]:
# Gelen verideki web sitelerini IP adresleri olarak varsayıyoruz
cihaz_ipleri.append(cihaz["website"])
return cihaz_ipleri
else:
print(f"HATA: API erişim reddedildi. Durum Kodu: {yanit.status_code}")
return []
except requests.exceptions.Timeout:
print("HATA: API bağlantısı zaman aşımına uğradı.")
return []
except Exception as e:
print(f"Beklenmeyen bir API hatası oluştu: {e}")
return []Senaryo Adım 2: Cihazlara Bağlanma ve Konfigürasyon Çekme (Netmiko)
API'den güncel cihaz IP'lerini başarıyla listeledik. Şimdi, netmiko kütüphanesini kullanarak cihazlara bağlanacak, komut çalıştıracak ve dönen çıktıyı alacağız. (Bu örnek, önceki serimizde yapılandırdığımız Cisco switch'lere bağlanıyormuşuz gibi tasarlanmıştır.)
from netmiko import ConnectHandler
import datetime
def cihaza_baglan_ve_komut_yolla(cihaz_ip, komut="show version"):
# Netmiko için cihaz bağlantı sözlüğünü (Dictionary) hazırlıyoruz
cisco_cihaz = {
'device_type': 'cisco_ios',
'host': cihaz_ip,
'username': 'admin',
'password': 'SistemciPassword123!',
'timeout': 10 # 10 saniye içinde yanıt gelmezse iptal et
}
try:
print(f"[{cihaz_ip}] adresine SSH bağlantısı deneniyor...")
# (Not: Gerçek cihaz olmadığı için bu adım test ortamında hata verecektir,
# ancak mantığın işlemesi için try-except bloğu devrededir.)
baglanti = ConnectHandler(**cisco_cihaz)
print(f"[BAŞARILI] {cihaz_ip} ile oturum açıldı.")
# Komutu çalıştır ve çıktıyı oku
cikti = baglanti.send_command(komut)
baglanti.disconnect()
return cikti
except Exception as e:
print(f"[BAŞARISIZ] {cihaz_ip} bağlantı hatası: Sistemsel Red veya Timeout.")
return "Baglanti_Hatasi"Senaryo Adım 3: Tüm Modülleri Birleştirmek ve Loglamak
Artık son aşamadayız. Bölüm 7'de öğrendiğimiz Dosya (I/O) işlemlerini de işin içine katarak otomasyonumuzu başlatalım. API'den cihazları çekecek, bir for döngüsü ile hepsine bağlanmayı deneyecek ve sonuçları kalıcı bir log dosyasına yazdıracağız.
# Ana Otomasyon Fonksiyonumuz
def otomasyonu_baslat():
print("=== KURUMSAL AĞ OTOMASYONU BAŞLATILIYOR ===\n")
# 1. API'den Listeyi Al
hedef_cihazlar = aktif_cihazlari_getir()
if len(hedef_cihazlar) == 0:
print("İşlem yapılacak cihaz bulunamadı. Otomasyon sonlandırılıyor.")
return
# 2. Döngü ile Cihazlara Müdahale Et ve Log Tut
with open("ag_otomasyon_raporu.log", "a") as log_dosyasi:
zaman_damgasi = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_dosyasi.write(f"\n--- YENİ OTOMASYON GÖREVİ: {zaman_damgasi} ---\n")
for ip in hedef_cihazlar:
# Örnek olarak cihazın Uptime veya versiyon bilgisini çekiyoruz
islem_sonucu = cihaza_baglan_ve_komut_yolla(ip, "show version")
# Log formatını hazırla ve dosyaya yaz (f-string ile)
if islem_sonucu != "Baglanti_Hatasi":
log_mesaji = f"[{ip}] OK - Veri basariyla cekildi.\n"
else:
log_mesaji = f"[{ip}] FAIL - Cihaza erisim saglanamadi.\n"
log_dosyasi.write(log_mesaji)
print("\n=== OTOMASYON TAMAMLANDI. Sonuçlar rapora kaydedildi. ===")
# Scripti çalıştıran komut
if __name__ == "__main__":
otomasyonu_baslat()
Serinin Sonu ve Yeni Başlangıçlar
Konsol ekranında yazdırdığımız "Merhaba Dünya" cümlesiyle başladığımız bu Python yolculuğunu, API bağlantıları kuran ve sistem logları üreten tam teşekküllü bir otomasyon mimarisiyle noktalıyoruz.
Unutmayın; kodlama bir ezber işi değil, problemleri mantıksal parçalara ayırma sanatıdır. Python'ın sunduğu bu temiz ve okunabilir yapı sayesinde ağ topolojilerinizi, sunucu güncellemelerinizi veya güvenlik denetimlerinizi otomatize etmek artık tamamen sizin elinizde.
Yazılım geliştirme ve sistem mühendisliğinin kesiştiği yeni ve gelişmiş senaryolarda görüşmek üzere! Kodlarınızın her zaman hatasız derlenmesi dileğiyle.
