Önceki bölümümüzde tekil verileri (bir IP adresi, bir port numarası) değişkenlerde nasıl saklayacağımızı gördük. Ancak gerçek dünya senaryolarında, ağımızdaki yüzlerce MAC adresini, onlarca VLAN bilgisini veya bir API'den dönen karmaşık JSON çıktılarını tek tek değişkenlere atamak imkansızdır. Verileri bir arada, düzenli ve erişilebilir şekilde tutmamız gerekir.
Sistemciler olarak otomasyon betiklerimizin belkemiğini oluşturan Python'ın 4 temel veri yapısına (Data Structures) göz atacağız. Bu yapılar veriyi nasıl tuttuğuna, değiştirilip değiştirilemeyeceğine ve sıralı olup olmadığına göre birbirinden ayrılır.
Listeler (List): Dinamik ve Esnek Yapı
Listeler, birden fazla veriyi tek bir çatı altında sıralı olarak tutmamızı sağlar. Köşeli parantezler [] kullanılarak tanımlanır. En büyük avantajı değiştirilebilir (mutable) olmasıdır; yani listeye sonradan eleman ekleyebilir veya silebiliriz.
Örneğin, yedeklemesini alacağımız switch'lerin IP adreslerini bir listede toplayalım:
switch_ipleri = ["192.168.1.10", "192.168.1.11", "192.168.1.12"]
# Listeye yeni bir IP eklemek (Listenin sonuna ekler)
switch_ipleri.append("192.168.1.15")
# Belirli bir veriyi okumak (Python'da sayma işlemi 0'dan başlar!)
print(f"İlk switch IP adresi: {switch_ipleri[0]}")
print(f"Toplam yedeklenecek switch sayısı: {len(switch_ipleri)}")Demetler (Tuple): Değiştirilemez Sabitler
Tuple'lar listelere çok benzer ancak kritik bir farkı vardır: Değiştirilemezler (immutable). Normal parantez () ile tanımlanırlar. Bir kere oluşturulduktan sonra içine yeni eleman ekleyemez veya silemezsiniz.
Peki neden kullanalım? Eğer bir verinin script çalışırken yanlışlıkla bile olsa değişmemesini garanti altına almak istiyorsanız (örneğin veritabanı bağlantı portları, sunucu koordinatları veya kritik servis hesapları), Tuple kullanmalısınız.
# Veritabanı bağlantı bilgileri (IP ve Port) değişmemelidir
db_baglantisi = ("10.0.5.50", 5432)
# db_baglantisi[1] = 3306 # Bu satırı çalıştırırsanız Python hata verecektir (TypeError).
print(f"Hedef DB IP: {db_baglantisi[0]} - Port: {db_baglantisi[1]}")Kümeler (Set): Eşsiz Verilerin Topluluğu
Matematikteki küme mantığıyla aynıdır. Süslü parantez {} ile tanımlanır. Set'lerin en önemli iki özelliği; sırasız (unordered) olmaları ve aynı elemandan birden fazla barındıramamalarıdır (unique).
Örneğin, bir ağ cihazının ARP tablosundaki logları okuduğunuzu varsayalım. Aynı MAC adresi log dosyasında yüzlerce kez geçebilir. Amacımız ağda kaç "farklı" cihaz olduğunu bulmaksa, listeyi Set'e çevirmek tüm tekrarları saniyeler içinde silecektir.
# Log dosyasından okunan ve tekrar eden VLAN id'leri
okunan_vlanlar = [10, 20, 10, 30, 20, 10, 99]
# Bu listeyi Set'e çevirerek tekrarlardan kurtulalım
essiz_vlanlar = set(okunan_vlanlar)
print(f"Ağdaki aktif benzersiz VLAN'lar: {essiz_vlanlar}")
# Çıktı: Ağdaki aktif benzersiz VLAN'lar: {10, 20, 30, 99}Sözlükler (Dictionary): Anahtar-Değer (Key-Value) İlişkisi
Sistem yöneticileri için Python'daki en önemli veri yapısı şüphesiz Sözlüklerdir (Dict). Verileri sadece yan yana dizmek yerine, onlara birer "etiket" yapıştırır. Süslü parantez {} ile tanımlanır ve anahtar: değer (key: value) formatında çalışır.
Özellikle REST API'ler ile çalışırken (örneğin Cisco ISE, Fortigate veya AWS API'lerinden veri çekerken) dönen JSON formatındaki veriler, Python'da doğrudan Dictionary olarak işlenir.
# Bir sunucunun donanım ve ağ yapılandırmasını bir sözlükte tutalım
sunucu_config = {
"hostname": "Web-Prod-01",
"ip_adresi": "192.168.100.5",
"os": "Ubuntu 22.04",
"cpu_core": 8,
"yayinda": True
}
# Veriyi anahtar (key) kelimeyi kullanarak okumak çok kolaydır
print(f"Cihaz Adı: {sunucu_config['hostname']}")
print(f"İşletim Sistemi: {sunucu_config['os']}")
# Yeni bir bilgi eklemek
sunucu_config["ram_gb"] = 32Verilerimizi nasıl organize edeceğimizi ve hangi senaryoda hangi veri yapısını (List, Tuple, Set, Dict) kullanmamız gerektiğini öğrendik. Ancak yazdığımız kodlar hala yukarıdan aşağıya dümdüz akıyor.
Gerçek bir otomasyon script'i karar verebilmelidir. "Eğer sunucunun ping yanıtı yoksa alarm ver, varsa geç" diyebilmek için programlamanın mantık kısmına geçiyoruz. Bir sonraki bölümümüzde If-Elif-Else Koşulları ve Mantıksal Operatörler ile kodumuza nasıl zeka katacağımızı inceleyeceğiz.
