C0 — Ops için Python#
"Bash bir satırı, Python bir aracı yazdırır. İkisinin sınırını bilmek ops mühendisliğidir."
Blok: C — Tekrarlanabilirlik · Süre: ~30 saat · Ön koşul: A5
🎯 Bu modülü bitirdiğinde#
- Argüman alan, hatayı düzgün ele alan ve okunabilir bir CLI aracı yazarsın.
- Bir HTTP API'ye istek atar, dönen JSON'ı işleyip bir çıktı üretirsin.
- Bir işin Bash'te mi Python'da mı yazılacağına gerekçeyle karar verirsin.
🧠 Niye bu, niye şimdi#
A5'te Bash'in nerede tıkandığını gördün (karmaşık veri, JSON, API). C2'deki CI adımları ve sonraki otomasyon işleri çoğu zaman bir Python betiğine dayanır. Bu yüzden C0, A5 ile C2 arasında bir köprüdür.
📖 Önce oku#
| Kaynak | Ne için | Süre |
|---|---|---|
A5 — Bash | Bash nerede tıkanır — Python'un başladığı sınır | ~15 dk |
STUDY-METHOD.md | dış kaynak sözleşmesi — resmi Python turu buradan | ~10 dk |
Repoda Python'u öğreten bir doküman yok (bilinçli boşluk). Bu modülün gövdesi ops için gereken temeli kendi başına verir: aşağıdaki Python sözdizimi köprüsü + örnekler, lab'ı dışarıya çıkmadan bitirmene yeter. Amaç dili baştan sona öğrenmek değil, iş görecek kadarı.
Sözdizimini köprünün ötesinde derinleştirmek opsiyoneldir — lab için şart değil. Gidersen, resmi Python turu bir dış kaynaktır ve dört-alanlı sözleşmeye uyar (STUDY-METHOD.md):
| Kaynak | Niye gidiyorsun | Orada ne yapacaksın | Süre | Dönünce doğrulama |
|---|---|---|---|---|
Resmi Python turu (docs.python.org/3/tutorial) | Sözdizimini köprünün ötesine taşımak (opsiyonel) | Bölüm 3–5'i (sayı/metin/liste, if/for, sözlük) okuyup örnekleri kendi yorumlayıcında çalıştır | ~2 saat | Bir dict'i for ile gezip f-string ile yazdıran 5 satırı bakmadan yazabiliyorsun |
🐍 Python nerede, Bash nerede#
Python'u bir dil olarak değil, Bash'in tıkandığı yeri açan bir araç olarak öğren.
| İş | Nerede |
|---|---|
Dosya taşı, komut zincirle, basit süzgeç (grep/awk) | Bash |
Çok adımlı akış, derin if/else, düzgün hata yönetimi | Python |
| JSON / API cevabı işlemek | Python (Bash'te jq bir yere kadar) |
| Tekrar kullanılacak, test edilecek, başkasının okuyacağı araç | Python |
Kural: bir Bash betiği 30 satırı geçtiyse ya da içinde JSON ayrıştırıyorsan dur — bu iş Python'a geçmiş demektir.
🧩 Python sözdizimi — Bash'ten gelenler için#
Aşağıdaki örnekleri okuyabilmen için Bash'ten farklı altı şey yeter. Bunları bilirsen lab'ı dışarı çıkmadan bitirirsin; gerisi ihtiyaç anında aranır.
| Bash | Python | Not |
|---|---|---|
VAR=deger / $VAR | var = "deger" / var | $ yok; değişkene doğrudan adıyla erişilir |
if [ ... ]; then … fi | if ...: + girinti | Blok : ile açılır; fi/done yok — bloğu girinti belirler |
for x in ...; do … done | for x in ...: + girinti | aynı mantık, do/done yok |
| (harici komut çağırmak) | import json | hazır yetenek import ile gelir, ayrı süreç değil |
${arr[0]} | d["anahtar"] / liste[0] | sözlük (dict) ve liste — anahtar/indeksle eriş |
"merhaba $ad" | f"merhaba {ad}" | f-string: {} içine değişken/ifade koyulur |
İki şey daha: - with open(...) as f: — dosyayı/bağlantıyı açar, blok bitince otomatik kapatır; Bash'teki gibi elle temizlik yapmana gerek kalmaz. Örnek 2'deki urlopen bu yüzden with ile. - Girinti kutsaldır. Bloğu süsleme parantezi değil, satır başındaki boşluk belirler. Karışık tab/boşluk → IndentationError. Bir dosyada tek stil kullan (4 boşluk).
Bu kadarıyla aşağıdaki üç örneği satır satır okuyabilirsin.
1️⃣ İlk araç: argüman + hata + çıkış kodu#
İyi bir ops aracı argüman alır, hatayı yutmaz ve çıkış koduyla konuşur (0 = başarı, ≠0 = hata). Bu, aracın bir pipeline'da (C2) kullanılabilmesinin ön şartıdır.
#!/usr/bin/env python3
import argparse, sys
def main():
p = argparse.ArgumentParser(description="Bir dizindeki büyük dosyaları listeler")
p.add_argument("path")
p.add_argument("--min-mb", type=int, default=100)
args = p.parse_args()
ok = do_scan(args.path, args.min_mb) # işin kendisi
if not ok:
print("HATA: dizin okunamadı", file=sys.stderr)
sys.exit(1) # pipeline bunu görür ve adımı kırar
if __name__ == "__main__":
main()
argparse sana bedavaya --help, tip kontrolü ve okunur hata verir; argümanları elle sys.argv'den ayıklama.
2️⃣ Bir API'ye istek, JSON işleme#
Ops işinin yarısı bir API'ye sorup cevabı işlemektir. İki kural: timeout koy (yoksa betik sonsuza asılır) ve durum kodunu kontrol et.
import json, urllib.request
req = urllib.request.Request(
"https://api.example.com/v1/status",
headers={"Authorization": "Bearer <TOKEN>"},
)
with urllib.request.urlopen(req, timeout=10) as r:
data = json.load(r)
for svc in data["services"]:
if svc["state"] != "healthy":
print(f"{svc['name']}: {svc['state']}")
requests kütüphanesi bunu daha kısa yazar ama bir bağımlılıktır; küçük işlerde stdlib urllib yeter. Hangisini seçtiğini gerekçelendir.
3️⃣ Hatayı yutma, çıkış koduyla konuş#
En sık ops hatası: except: pass. Bu hatayı görünmez yapar; betik "başarılı" görünür ama iş yapılmamıştır.
try:
result = do_work()
except FileNotFoundError as e:
print(f"HATA: {e}", file=sys.stderr)
sys.exit(2) # yalnız beklediğin hatayı yakala, hepsini değil
sys.exit(kod) ile çağırana ne olduğunu söyle — sessiz başarısızlık en pahalı hatadır.
4️⃣ Bağımlılık ve okunabilirlik#
- Sanal ortam:
python3 -m venv .venv && source .venv/bin/activate. Sistem Python'una paket kurma. - Sabitle: kullandığın paketi
requirements.txt'e yaz — C2 pipeline'ı aynı sürümü kursun. - Küçük tut: amacın ürün değil, tekrar eden işi bitirmek. Bir betik bir şey yapsın, onu iyi yapsın.
🔨 Lab#
Ayrı bir lab dizini yok — bu modülün pratiği aşağıdaki kabul kriterleridir: argparse'li bir CLI + JSON çeken bir betik yaz. Burada yazdığın aracı sonra C2 CI lab'ında (L10) pipeline'a koyarsın.
✅ Kabul kriterleri#
Hepsi doğrulanmadan sonraki modüle geçme: - [ ] argparse ile argüman + hata yönetimi olan, sıfır/sıfır-dışı çıkış kodu döndüren çalışan bir CLI aracı yazdın - [ ] Bir API'den JSON çekip özetleyen, timeout + durum kontrolü olan bir betik yazdın — çıktısı gösterilebiliyor - [ ] "Bu işi niçin Bash yerine Python'da (ya da tersi) yazdım" — yazılı gerekçe - [ ] except: pass ile hata yutmanın niçin tehlikeli olduğunu kendi cümlelerinle yazdın (aracının README/notuna)
🧪 Kendini test et#
- Bir betiği ne zaman Bash'ten Python'a taşırsın? İki somut sinyal ver.
except: passniçin ops'ta bir hata değil, bir tuzaktır?- Aracın ileride bir CI adımında çalışacak (CI'ı
C2'de göreceksin — şimdilik "her commit'te otomatik çalışan komut dizisi" kadarını bil). Onu bu dizide sorunsuz kullanılır ("pipeline dostu") yapan iki şey ne, niye?
Cevaplar
1. (a) Bash betiği 30+ satıra çıkıp `if/else` derinleştiğinde; (b) JSON/API cevabı ayrıştırdığında (`jq` bir yere kadar). Üçüncü sinyal: araç test edilecek ya da başkası okuyacaksa. 2. Hatayı görünmez yapar: betik başarılı görünür (çıkış 0) ama iş yapılmamıştır — en pahalı hata sessiz olandır. Yalnız beklediğin hatayı yakala, gerisini çağırana `sys.exit(≠0)` ile bildir. 3. (a) **Çıkış kodu:** 0 başarı, ≠0 hata — pipeline buna bakarak adımı kırar/geçirir; (b) **stderr:** hatayı stdout'tan ayrı yazmak log ile çıktının karışmasını önler. İkisi olmadan araç sessizce başarısız olur.🆘 Takıldıysan#
| Belirti | Muhtemel sebep | Ne yap |
|---|---|---|
ModuleNotFoundError | Paket sistem Python'unda / venv aktif değil | venv oluştur + aktive et; pip install; requirements.txt'e yaz |
| Betik bir API çağrısında asılı kalıyor | timeout yok | urlopen(..., timeout=10); her ağ çağrısına timeout koy |
| Betik "başarılı" ama iş yapılmamış | except: pass hatayı yutmuş | Yalnız beklenen hatayı yakala; sys.exit(≠0) ile bildir |
| CLI argümanları elle ayıklanıyor, kırılgan | sys.argv ile manuel ayıklama | argparse kullan — bedava --help + tip kontrolü |
💼 Portfolyo çıktısı#
Küçük ama gerçek bir ops aracı (örn. bir sağlık kontrolü / rapor betiği).
⏭️ Sırada#
"Python'u yazılımcı gibi değil, operasyoncu gibi öğren: amacın ürün değil, tekrar eden işi bitirmek."