26 Temmuz 2026 Pazar

Ansible değişkenlerini doğru yerde tutmak

Ansible Değişkenlerini Doğru Yerde Tutmak

Ansible · Değişkenler

Ansible değişkenlerini doğru yerde tutmak

Ansible'da 22 farklı değişken katmanı var. Asıl soru “hangisi kazanır?” değil — belgelerde yazıyor. Asıl soru şu: bu değişkeni nereye koymalıyım?

Ansible öğrenirken herkesin karşılaştığı bir an vardır: bir değişkeni değiştirirsiniz ama hiçbir şey olmaz. Başka bir yerde tanımlı aynı isimli değişken sizinkini eziyordur. Bu noktada çoğu kişi öncelik tablosunu ezberlemeye çalışır. Oysa tabloyu ezberlemek semptomu tedavi eder; hastalığı değil.

Hastalık şu: değişkeni ne olduğuna değil, o an aklınıza gelen yere koymak. Bu yazıda gerçek bir projeden — RHEL 9 ve RHEL 10 için osbuild-composer ile imaj üreten bir rolden — örneklerle, bir değişkenin yerini nasıl belirleyeceğinizi anlatacağım. Kendi yaptığım hatayı da göstereceğim.

Önce kısa hatırlatma: öncelik sırası

Ansible değişkenleri en düşükten en yükseğe doğru şu sırayla uygular. Sondakiler öncekileri ezer:

#KatmanNe zaman kullanılır
2Rol defaults/Rolün makul varsayılanı
3Envanter dosyasındaki grup değişkenleriNadiren; dağınık olur
4Envanter group_vars/allTüm makinelere ortak makine bilgisi
5Playbook group_vars/allPlaybook'a özgü, tüm gruplara
6Envanter group_vars/*Ortama/gruba özgü makine bilgisi
7Playbook group_vars/*Playbook'un gruba özgü zorlaması
9Envanter host_vars/*Tek makineye özgü
11Facts ve set_factÇalışma anında keşfedilen
12Play vars:Playbook'un kendi bağlamı
15Rol vars/Rolün ezilmemesi gereken sabitleri
18include_varsKoşullu yükleme (ör. sürüme göre)
22-e extra varsTek çalıştırmaya özgü; her şeyi ezer

Dikkat edilecek iki nokta var. Birincisi: group_vars/ ve host_vars/ iki ayrı yerde bulunabilir — envanterin yanında ve playbook'un yanında. İkincisi: playbook'un yanındaki, envanterinkini ezer.

Bunu kanıtlayalım

İddiaya güvenmeyin, ölçün. Üç katmanda aynı değişkeni tanımlayıp tek tek kaldıralım:

$ tree
├── inventory/
│   ├── hosts.yml
│   └── group_vars/all.yml        → nereden: "2-INVENTORY group_vars/all"
├── group_vars/all.yml            → nereden: "3-PLAYBOOK group_vars/all"
├── roles/demo/defaults/main.yml  → nereden: "1-ROLE defaults"
└── pb.yml
$ ansible-playbook -i inventory/hosts.yml pb.yml
kazanan -> 3-PLAYBOOK group_vars/all

$ rm group_vars/all.yml && ansible-playbook ...
kazanan -> 2-INVENTORY group_vars/all

$ rm inventory/group_vars/all.yml && ansible-playbook ...
kazanan -> 1-ROLE defaults
Playbook group_vars > envanter group_vars > rol defaults. Beklendiği gibi.

Pratik ipucu. Bir değerin nereden geldiğini merak ettiğinizde tahmin etmeyin: ansible-inventory --graph --vars ve ansible-inventory --host <makine> size envanterden gelenlerin tamamını gösterir. Rol katmanları için de ansible-playbook --list-tasks ve bir debug görevi en hızlı yoldur.

Asıl soru: bu değişken neyi tarif ediyor?

Karar kuralı bu kadar basit. Değişkenin adına değil, anlamına bakın:

Değişken neyi tarif ediyor?YeriNeden
Makineyi / ortamı
“RHEL 9 sunucusu şudur”
Envanter group_vars/ Envanterle birlikte seyahat eder. Aynı envanteri kullanan her playbook aynı bilgiyi alır.
Rolün makul varsayılanını
“aksi söylenmedikçe böyle davran”
Rol defaults/ En düşük öncelik = her katmandan ezilebilir. Rol kendi kendine yeter hale gelir.
Playbook'un kendi bağlamını
“çıktıları buraya yaz”
Play vars: Hedef makineyle ilgisi yoktur; envantere konursa yanlış yere yayılır.
Bu çalıştırmaya özgü seçimi
“şimdi RHEL 10 üret”
-e Her şeyi ezer, kalıcı değildir. Tam da geçici seçim için.
Ezilmemesi gerekeni
iç sabitler, eşleme tabloları
Rol vars/ Yüksek önceliklidir; kullanıcının kazara ezmesini istemediğiniz şeyler.

Gerçek bir örnek: osbuild imaj üretim rolü

Bu rol, parametre alarak RHEL 9 veya RHEL 10 için ISO / qcow2 / vmdk imajları üretiyor:

ansible-playbook build-image.yml \
  -e rhel_version=10 -e image_template=devel \
  -e '{"image_types":["qcow2","vmdk"]}'

rhel_version doğrudan hedef grubu seçiyor: RHEL 9 imajı RHEL 9 sunucusunda üretilmeli, çünkü osbuild-composer kendi host sürümünü varsayılan distro olarak alır.

Envanterde ne var

# inventory/group_vars/osbuild_rhel10.yml
ansible_user: remzi
ansible_become: true
osbuild_expected_major: "10"
osbuild_extra_sources:
  - id: crb
    url: https://cdn.redhat.com/.../codeready-builder/os
    required_for_templates: ["devel"]

Bunların hepsi makineyi tarif ediyor. “RHEL 10 sunucusunda CRB deposu gerekir” bilgisi, hangi playbook'u çalıştırdığınızdan bağımsızdır. Yarın bir cleanup.yml yazarsanız o da aynı envanteri kullanıp aynı bilgiyi alır.

Rol varsayılanlarında ne var

# roles/osbuild_image/defaults/main.yml
run_boot_test: true
enable_kdump: true
kdump_crashkernel: "2G-64G:256M,64G-:512M"
min_free_gib: {minimal: 12, devel: 30}

lvm_volumes:
  - {name: rootlv,     mount: /,          size_gib: 30, label: root}
  - {name: varcrashlv, mount: /var/crash, size_gib: 2,  label: var_crash}
  # ... 11 mantıksal birim

Disk şeması burada olmalı, çünkü rolün ne ürettiğini tarif ediyor. Üstelik tek kaynak olması sayesinde hem customizations.disk (qcow2/vmdk) hem de kickstart logvol satırları (ISO) aynı listeden üretiliyor — ikisinin birbirinden ayrışması yapısal olarak imkânsız hale geliyor.

Playbook'ta ne var

# build-image.yml
  vars:
    image_fetch_dir: "{{ playbook_dir }}/imajlar"
    artifact_dir: "{{ playbook_dir }}/artifacts"

Bunlar kontrol makinesinin yolları. Hedef sunucuyla hiçbir ilgileri yok. Ayrıca playbook_dir ancak playbook bağlamında anlamlıdır — envantere koyarsanız, aynı envanter başka bir dizinden kullanıldığında yanlış çözülür.

Benim yaptığım hata

İlk versiyonda politika değişkenlerinin hepsini envanterin group_vars/all.yml dosyasına koymuştum:

# inventory/group_vars/all.yml   ← YANLIŞ
run_boot_test: true
enable_kdump: true
min_free_gib: {minimal: 12, devel: 30}
compose_timeout_min: 90
image_fetch_dir: "{{ playbook_dir }}/imajlar"

Çalışıyordu. Ama iki gerçek sakıncası vardı:

  1. Ezme zinciri yanlış yerden başlıyordu. enable_kdump rolün varsayılanı olmalıydı. Envantere konunca rol defaults'ı sessizce eziliyor ve rol tek başına anlamsız hale geliyor — birisi rolü başka bir projede kullanmak istese, hangi değişkenleri tanımlaması gerektiğini bilemez.
  2. İkinci bir ortam eklendiğinde kopyalama zorunluluğu. inventory/prod/ ve inventory/test/ açtığınızda, ortamla hiç ilgisi olmayan politika değişkenlerini de iki kez yazmanız gerekir. Kopya olan yerde er geç ikisi birbirinden ayrışır.

Düzeltilmiş hali:

DeğişkenÖnceSonra
ansible_user, osbuild_extra_sourcesenvanter group_varsaynı — doğruydu
enable_kdump, run_boot_test, min_free_gibenvanter group_vars/allrol defaults
image_fetch_dir, artifact_direnvanter group_vars/allplay vars:
rhel_version, image_types-eaynı — doğruydu

Envanterin group_vars/all.yml dosyası artık boş — ama silmedim. İleride gerçekten tüm makinelere ortak bir makine ayarı gerektiğinde (proxy, zaman sunucusu, ortak depo) yeri orasıdır. Dosyanın içine bunu bir yorum olarak yazdım; boş bir dosyadan çok, niyeti belgelenmiş bir dosya bırakmak daha iyidir.

Sürüme göre değişenler: include_vars

Bu projede öğrendiğim en değerli şeylerden biri, sürüm farklarını veri olarak tutmaktı. RHEL 10'da kdump, kexec-tools paketinden ayrılıp kdump-utils'e taşınmış. Bunu göreve gömmek yerine:

- name: "Sürüme özel değişkenleri yükle"
  ansible.builtin.include_vars:
    file: "rhel{{ rhel_version }}.yml"

Böylece vars/rhel9.yml ve vars/rhel10.yml sürüm farklarını taşır, görevler sürümden bağımsız kalır. include_vars'ın önceliği yüksektir (18. sıra) — bu tam olarak istediğimiz şey: sürüme özgü veri, genel varsayılanı ezmeli.

Daha da iyisi: bu projede kdump paketini sabit yazmak yerine çalışma anında sorduk — dnf repoquery --file /usr/lib/systemd/system/kdump.service. Sonuç: RHEL 9'da kexec-tools, RHEL 10'da kdump-utils bulundu, hiçbir yere sabit yazılmadan. Değişkene hiç gerek kalmadı. En iyi değişken, yazmak zorunda kalmadığınız değişkendir.

Kaçınılması gereken üç tuzak

1. set_fact tipi sessizce değiştirir

Bir JSON dosyasını okuyup metin araması yapmak istedim:

- set_fact:
    manifest_text: "{{ manifest_raw.content | b64decode }}"

- assert:
    that: "'org.osbuild.lvm2.create' in manifest_text"   # her zaman False!

İçerik JSON'a benzediği için Ansible onu otomatik olarak dict'e çevirdi. Dolayısıyla in operatörü metin değil anahtar araması yaptı. Aradığım şey dosyada vardı ama testi hiç geçmiyordu. Çözüm: metin araması yerine from_json ile ayrıştırıp yapısal denetim yapmak.

2. delegate_to bağlantı değişkenlerini değiştirir

- command: "{{ 'cp ...' if ansible_connection == 'local' else 'scp ...' }}"
  delegate_to: localhost      # ← ansible_connection artık 'local'!

Delegasyon yapılan görevde ansible_connection, delegasyon hedefinin bağlantı türüdür. Asıl hedefin bilgisini kullanacaksanız, onu delegasyondan önce bir set_fact ile saklayın. Bu hatayı fark etmem, aynı kodun bir sunucuda çalışıp diğerinde patlamasını görmemi gerektirdi.

3. -e geri alınamaz

Extra vars her şeyi ezer ve playbook içinden değiştirilemez. Bu yüzden -e'yi yalnızca o çalıştırmaya özgü seçimler için kullanın (rhel_version, image_types). Kalıcı politikayı -e ile taşımaya başlarsanız, her çalıştırmada uzun bir komut satırı ezberlemek zorunda kalırsınız — ve bir gün birini yazmayı unutursunuz.

Özet: karar ağacı

SoruCevap
Makineyi/ortamı mı tarif ediyor?Envanter group_vars/ · host_vars/
Rolün makul varsayılanı mı?Rol defaults/
Sürüme/platforma göre mi değişiyor?Rol vars/ + include_vars
Playbook'un kendi bağlamı mı?Play vars:
Bu çalıştırmaya mı özgü?-e
Kullanıcı ezerse bozulur mu?Rol vars/ (defaults değil)

Bu kuralı uyguladığınızda öncelik tablosunu ezberlemenize gerek kalmaz — çünkü çakışma çıkmaz. Tablo, ancak aynı değişkeni birden fazla katmanda tanımladığınızda gerekir; ve bunu yapıyorsanız muhtemelen değişkeni yanlış yere koymuşsunuzdur.

Bu yazıdaki örnekler, RHEL 9 ve RHEL 10 için osbuild-composer ile ISO / qcow2 / vmdk imajları üreten gerçek bir Ansible rolünden alınmıştır. Öncelik sırasının tamamı için: Ansible — Using Variables.

16 Haziran 2026 Salı

Podman'da "unresolvable CDI devices nvidia.com/gpu=all" Hatası ve Çözümü

Podman'da "unresolvable CDI devices nvidia.com/gpu=all" Hatası ve Çözümü

Podman ile GPU gerektiren bir container (örneğin RHEL CLA, ollama, vllm gibi) çalıştırmaya çalışırken şu hatayı alabilirsiniz:

Error: setting up CDI devices: unresolvable CDI devices nvidia.com/gpu=all


















Bu hata, NVIDIA sürücünüz düzgün çalışıyor olsa bile (nvidia-smi çıktısı normal görünse bile) ortaya çıkabilir. Sorunun kaynağı, Podman'ın GPU'ya erişmek için kullandığı CDI (Container Device Interface) spec dosyasının sisteminizde bulunmamasıdır.

CDI Nedir?

CDI, container runtime'larının (Podman, Docker vb.) GPU gibi özel donanımlara erişimini standartlaştıran bir arayüzdür. Podman, --device nvidia.com/gpu=all gibi bir parametre aldığında, /etc/cdi/nvidia.yaml dosyasına bakarak GPU'nun container'a nasıl sunulacağını öğrenir. Bu dosya yoksa veya güncel değilse, yukarıdaki hatayı alırsınız.

Çözüm Adımları

1. NVIDIA Container Toolkit Kurulumu

Öncelikle nvidia-container-toolkit paketinin kurulu olup olmadığını kontrol edin:

rpm -q nvidia-container-toolkit

Kurulu değilse, NVIDIA'nın resmi repo'sunu ekleyip kurun:

curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
  sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo

sudo dnf install -y nvidia-container-toolkit

2. CDI Spec Dosyasını Oluşturun

Bu adım sorunun asıl çözümüdür. Aşağıdaki komut, sisteminizde bulunan NVIDIA GPU'ları tarayarak CDI spec dosyasını oluşturur:

sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

3. Doğrulama

Spec'in başarıyla oluşturulduğunu doğrulayın:

nvidia-ctk cdi list

Çıktıda şuna benzer satırlar görmeniz gerekir:

INFO[0000] Found 2 CDI devices
nvidia.com/gpu=0
nvidia.com/gpu=all

4. Container'ı Tekrar Çalıştırın

Artık Podman GPU'yu CDI üzerinden çözebilir durumda. Uygulamanızı tekrar başlatın:

rhel-cla start

Alternatif: Spesifik GPU Belirtme

Eğer gpu=all hâlâ çözülemiyorsa, uygulamanızın yapılandırma dosyasında cihazı spesifik olarak belirtmeyi deneyin:

# nvidia.com/gpu=all yerine:
nvidia.com/gpu=0

Örneğin RHEL CLA için bu ayar ~/.config/rhel-cla/.env dosyasındadır.

Önemli Not

Kernel veya NVIDIA sürücü güncellemesi sonrasında CDI spec dosyası geçersiz hale gelebilir. Sürücü güncellemesi yaptıktan sonra sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml komutunu tekrar çalıştırmayı unutmayın.

Ortam Bilgisi

Bu yazıdaki çözüm aşağıdaki ortamda test edilmiştir:

  • Fedora / RHEL tabanlı dağıtımlar
  • NVIDIA GeForce RTX 4060 Laptop GPU
  • NVIDIA Driver 595.80, CUDA 13.2
  • Podman (rootless ve rootful)



















Umarım işinize yarar. Sorularınız varsa yorumlarda belirtebilirsiniz.

27 Şubat 2026 Cuma

Ne işe yarar; sar -n DEV

sar -n DEV|awk 'BEGIN{mak=0} !/txpck|x86|CPU|^[ \t]*$/{if (mak<$5) {mak=$5;li=$0}} END{print mak,li;}'

29 Aralık 2025 Pazartesi

Elektrikli Bisiklet Bataryaları hakkında

Bafang M615 (BBS02B / BBSHD) – Tam Paket Tablo + BOM + Özet

Bafang M615MM G320.750/1000.C (BBS02B / BBSHD) – Tam Paket Özellikler + Batarya + BOM

Bu sayfa: 750W ve 1000W varyantları için (48V ve 52V senaryoları dahil) teknik özet, aynakol (36T’den başlayarak), ısı/sürekli güç pratikleri, elektrik güvenliği, menzil hesap şablonu ve BOM (parça listesi) + otomatik toplamlar içerir.

Önemli not: “Tepe güç” burada pratikte en sık kullanılan tanımla, yaklaşık (Voltaj × Kontrolcü Akımı) olarak “tepe elektriksel giriş gücü” şeklinde hesaplanmıştır. Gerçek mekanik tepe; hız, vites, kadans, ısı ve yükle değişir.

1) Motor Özellikleri (Özet Tablo)

Motor kodu Piyasa adı Nominal (W) V A (tipik) Tepe (≈W) Tork BB uyumu (mm) Ağırlık (kg) İdeal batarya (BMS)
MM G320.750.C BBS02B 750 48 25 1200 ≈120–160 Nm (piyasada farklı yazılabilir) 68 / 73 / 83 / 90 / 100 / 110 / 120 5.6 48V BMS ≥30A (35A önerilir)
MM G320.1000.C BBSHD 1000 48 30 1440 160 Nm (Peak 200 Nm) 68 / 73 / 83 / 90 / 100 / 110 / 120 5.6 48V BMS ≥40A (45A önerilir)
MM G320.750.C BBS02B (52V) 750 52 25 1300 ≈120–160 Nm 68 / 73 / 83 / 90 / 100 / 110 / 120 5.6 52V BMS ≥30A (35A önerilir)
MM G320.1000.C BBSHD (52V) 1000 52 30 1560 160 Nm (Peak 200 Nm) 68 / 73 / 83 / 90 / 100 / 110 / 120 5.6 52V BMS ≥40A (45A önerilir)

2) Batarya Boyutlandırma (Ah/Wh önerileri)

Senaryo V A BMS (A) Min Ah Rahat Ah Min Wh Rahat Wh Not
BBS02B 48V 48 25 30 17 24 816 1152 Şehir + orta yokuş: 24Ah+ daha stabil (voltaj sarkması azalır)
BBSHD 48V 48 30 40 20 28 960 1344 Yokuş/kargo: 28Ah civarı daha az ısınma + daha az voltaj düşümü
BBS02B 52V 52 25 30 17 24 884 1248 52V: daha canlı tepki/hız; kablo/konnektör/BMS uyumu şart
BBSHD 52V 52 30 40 20 28 1040 1456 Performans yüksek: XT90-S + güçlü sigorta + kalın kablo önerilir

3) Aynakol / Dişli Seçimi (36T’den başlayarak)

Aynakol (T) Kullanım Artıları Eksileri Önerilen motor Not
36T Dik yokuş / kargo / düşük hız Tırmanış çok güçlü, ısı daha az Düzde maksimum hız düşer BBS02B veya BBSHD Yokuş/kargo ağırlıklı için en güvenli başlangıç
38T Yokuş + şehir dengesi Denge iyi 36T kadar tırmanış avantajı yok BBS02B / BBSHD Günlük kullanım için çok iyi “orta yol”
40T Şehir + hafif yokuş Şehir hızlarında rahat Ağır yükte ısınma artabilir BBS02B Düz ağırlıklı rotalarda mantıklı
42T Genel kullanım (kitlerde yaygın) Parça bulunurluğu yüksek Uzun/dik yokuşta akım yükselir BBS02B / BBSHD Uzun yokuş varsa 36–38T daha sağlıklı
44T Hız odaklı şehir/banliyö Düzde daha yüksek hız Yokuşta zorlar BBSHD Kargo/yokuş ağırlıklı önerilmez
46T Maksimum hız odaklı Düzde en yüksek hız Yokuş verimsiz + ısı/akım artar BBSHD Fren/lastik/aktarma güçlü olmalı

4) Sürekli Güç & Isı (Pratik Derating)

Koşul Sürekli güç önerisi Akım davranışı Risk Pratik önlem
Düz yol, 20–30 km/h, iyi hava akımı Nominalin %80–100’ü mümkün Ortalama akım daha düşük Düşük Kadansı 80–100 rpm aralığında tut, uygun vites kullan
Uzun yokuş (6–10%), 10–18 km/h Nominalin %50–70’i Akım uzun süre yüksek kalır Orta 36–38T, düşük vites, dur-kalk azalt
Çok dik yokuş (>10%), düşük hız (<10 km/h) Nominalin %30–50’si Akım maksimuma yakın Yüksek Mola/soğut, daha küçük aynakol, mümkünse BBSHD + güçlü batarya
Kargo + yokuş (ağır yük) Nominalin %30–60’ı Voltaj sarkması olabilir Yüksek Yüksek BMS, kalın kablo, iyi fren/aktarma, 36T önerilir
Sıcak hava (30°C+), düşük hız Nominalin %30–60’ı Isı birikir Yüksek Aralıklı sürüş, gölgede soğut, kadansı yükselt

5) Elektrik & Güvenlik Önerileri

Bileşen BBS02B (25A) öneri BBSHD (30A) öneri Not
Ana besleme kablosu (batarya→motor) 12 AWG (min) 10 AWG (öneri) / 12 AWG (min) Kablo kısa olsun; 52V/uzun kablo/ısı için kalınlaştır
Konnektör XT60 (min) XT90 / XT90-S (öneri) XT90-S (anti-spark) kıvılcımı azaltır
Sigorta (batarya çıkışı) 35A (Blade/MIDI) 45A (Blade/MIDI) Bataryaya yakın konumda
BMS sürekli akım ≥30A (35A rahat) ≥40A (45A rahat) BMS “sürekli” akım kapasitesi kritik
Şarj 5A 5–8A Hızlı şarjda kablo/konnektör ısınmasını takip et

6) Senaryo Önerileri

Senaryo Motor Voltaj Aynakol (başlangıç) Batarya örneği Kritik not
Şehir içi, düz ağırlıklı BBS02B 48V 38–42T (min 36T) 48V 20–24Ah, BMS ≥30–35A Uzun yokuş varsa 36–38T daha iyi
Şehir + düzenli yokuş (6–10%) BBS02B / BBSHD 48V 36–38T 48V 24–28Ah, BMS ≥35–45A Isı yönetimi için küçük aynakol + uygun vites
Dağ/çok dik yokuş BBSHD 48V/52V 36T 52V 24–28Ah, BMS ≥45A Düşük hızda uzun süre tam akım ısınma yapar; mola/soğut
Kargo / ağır yük + yokuş BBSHD 48V 36T 48V 28Ah+, BMS ≥45A Fren/aktarma güçlendir; XT90-S önerilir
Banliyö / hız odaklı BBSHD 52V 40–46T (min 36T) 52V 24–28Ah, BMS ≥45A Fren ve lastik kalitesi çok önemli

7) Menzil Hesabı (İnteraktif)

Kural: Wh = V × Ah, Menzil (km) = Wh / (Wh/km)
Tipik tüketim aralıkları: Düz: 8–12 Wh/km Karma: 12–18 Wh/km Yokuş/Kargo: 18–28 Wh/km

Enerji (Wh)
Wh = V × Ah
Tahmini menzil (km)
km = Wh / (Wh/km)
Not
Sürüş tarzı/lastik/rüzgar/yokuş etkiler

Hızlı örnekler

Senaryo Örnek batarya Wh/km Menzil
Şehir düz 48V 20Ah (960Wh) 10 ≈ 96 km
Şehir karma 48V 24Ah (1152Wh) 15 ≈ 77 km
Yokuş/kargo 48V 28Ah (1344Wh) 22 ≈ 61 km
Hız odaklı 52V 24Ah (1248Wh) 18 ≈ 69 km

Bu örnekler “yaklaşık”tır. Yüksek hız + rüzgar + düşük lastik basıncı tüketimi hızlı yükseltir.

14 Eylül 2025 Pazar

🚴 Yeni Başlayanlar İçin Elektrikli Bisiklet Yapım Kılavuzu (2025) - Beginner’s Guide to Building an Electric Bike (2025) 🚴

🚴 Yeni Başlayanlar İçin Elektrikli Bisiklet Yapım Kılavuzu (2025)

🚴 Yeni Başlayanlar İçin Elektrikli Bisiklet Yapım Kılavuzu (2025)

Yaklaşık iki yıllık elektrikli bisiklet yapım tecrübemle, yeni başlayanların en sık yaptığı hataları ve dikkat edilmesi gereken noktaları paylaşmak istiyorum. Amaç, yanlış seçimler yüzünden gereksiz masraf ve zaman kayıplarını önlemek.

1. Kadro Seçimi

  • Disk frenle uyumlu olmalı
  • Orta kısımda motor ve pil için boşluk olmalı
  • Çelik veya sağlam alaşım kadro daha dayanıklıdır

2. Motor Seçimi

Kullanım Alanı Motor Gücü Not
Şehir içi, düz yollar 250W – 500W Türkiye'de yasal sınır 250W / 25 km/s
Hafif yokuş, uzun turlar 500W – 750W Orta seviye kullanım
Dik yokuş, dağlık alanlar 750W – 1000W Örn: Bafang BBSHD 1000W

3. Pil Seçimi

Motor Gücü Minimum Pil İdeal Pil Not
250W 250W 400W Şehir içi için yeterli
500W 500W 800W Uzun menzil avantajlı
1000W 1000W 1500–1700W BBSHD kısa süreli 1764W çekebilir
Kaliteli hücreler: Samsung, LG, Panasonic
Voltaj: 48V yaygın, 52V daha verimli ama şarj cihazı uyumluluğunu kontrol edin

4. Jant ve Göbek

  • 36 delikli göbek ve sağlam telleri kullanın
  • Normal bisiklet telleri kolay kırılır
  • Arka göbek dayanıklı olmalı

5. Lastik Seçimi

Lastik Türü Hız Sınırı Uygunluk
Normal bisiklet lastiği 25 km/h ❌ Güvenli değil
E-Bike lastiği (E25) 25 km/h ✅ Şehir içi
E-Bike lastiği (E50) 50 km/h ✅ Uzun mesafe, yüksek hız

6. Güvenlik

  • Korna: Trafikte şart
  • Ayna: Motosiklet aynası uyarlanabilir
  • Aydınlatma: Ön/arka LED far
  • Frenler: 500W+ için hidrolik disk fren
  • Koruma: Kask, eldiven, dizlik

7. Yedek Parça ve Bakım

  • Zincir, dişliler, fren balataları hızlı aşınır
  • E-bike uyumlu zincir kullanın
  • Düzenli bakım yapın
Sonuç: Elektrikli bisiklet yapmak keyifli ama dikkat isteyen bir iş. Yanlış parçalar hem güvenliği hem de bütçenizi olumsuz etkiler.
👉 En önemli tavsiyem: Ucuza kaçmayın. Kaliteli parçalar daha pahalı olabilir ama uzun vadede daha güvenli ve ekonomik olacaktır.

🚴 Beginner's Guide to Building an Electric Bike (2025)

With about two years of experience in building electric bikes, I want to share the most common mistakes beginners make and the key points to consider. The goal is to avoid unnecessary costs and wasted time due to wrong choices.

1. Frame Selection

  • Must be compatible with disc brakes
  • Should have enough space for motor and battery
  • Steel or strong alloy frames are more durable

2. Motor Choice

Usage Area Motor Power Notes
City rides, flat roads 250W – 500W Legal limit in Turkey is 250W / 25 km/h
Light hills, long rides 500W – 750W Mid-level usage
Steep hills, mountains 750W – 1000W Example: Bafang BBSHD 1000W

3. Battery Selection

Motor Power Minimum Battery Ideal Battery Notes
250W 250W 400W Enough for city use
500W 500W 800W Good for longer range
1000W 1000W 1500–1700W BBSHD can pull up to 1764W
Quality cells: Samsung, LG, Panasonic
Voltage: 48V is common, 52V is more efficient but check charger compatibility

4. Rims & Hubs

  • Use 36-hole hubs and strong spokes
  • Regular spokes break easily
  • Rear hub must be durable

5. Tires

Tire Type Speed Rating Suitability
Regular bicycle tire 25 km/h ❌ Not safe
E-Bike tire (E25) 25 km/h ✅ City rides
E-Bike tire (E50) 50 km/h ✅ Long distance, higher speed

6. Safety

  • Horn: Essential in traffic
  • Mirrors: Motorcycle mirrors can be adapted
  • Lights: Front and rear LED lights
  • Brakes: Hydraulic disc brakes for 500W+
  • Protection: Helmet, gloves, knee pads

7. Spare Parts & Maintenance

  • Chains, cogs, brake pads wear out fast
  • Use e-bike compatible chains
  • Perform regular maintenance
Conclusion: Building an e-bike is fun but requires attention. Wrong parts can hurt both your safety and your budget.
👉 My main advice: Don't go cheap. Good components may cost more, but they are safer and more economical in the long run.

19 Ağustos 2025 Salı

Redis, Valkey vs. Dragonfly

🚀 Redis vs Valkey vs Dragonfly: 2025'te Hangi In-Memory Database Seçilmeli?

📊 Hızlı Özet

Linux tabanlı sistemlerde yüksek performans ve HA arıyorsanız:

  • Dragonfly: 25x daha hızlı, %38 daha az bellek kullanımı
  • Valkey: Tam açık kaynak, Redis'ten 3x daha hızlı
  • Redis: En geniş özellik seti, karmaşık lisanslama

1. Genel Bakış ve Temel Özellikler

Redis

  • 15+ Yıllık Olgun Teknoloji
  • Karmaşık Lisans

Valkey

  • 2024 Redis Fork'u
  • Açık Kaynak

Dragonfly

  • 2022 Modern Mimari
  • En Hızlı

🔑 Anahtar Farklılıklar:

  • Redis: Single-threaded, AGPLv3/SSPLv1/RSALv2 lisans
  • Valkey: Enhanced I/O threading, BSD 3-clause lisans, Linux Foundation desteği
  • Dragonfly: Multi-threaded shared-nothing, BSL lisans, Redis/Memcached uyumlu

2. 📈 Performans Karşılaştırması

Throughput (Saniyedeki İşlem Sayısı)

Sistem 16 vCPU 32 vCPU 48 vCPU Notlar
Redis 8.0 ~400K RPS ~500K RPS ~600K RPS Limited scaling
Valkey 8.1 1.19M RPS 1.5M RPS 1.8M RPS 3x Redis
Dragonfly 2.85M RPS 6.75M RPS 8.1M RPS Linear scaling

Latency (Gecikme Süreleri)

Sistem P50 P99 P99.9
Redis <1ms 2-3ms 5-10ms
Valkey <1ms 1-2ms 3-7ms
Dragonfly <0.5ms <1ms 2-5ms

⚡ CPU-Yoğun İşlemler (ZADD Benchmark)

48 vCPU sistemde sorted set işlemleri:

  • Redis/Valkey: ~280K ops/sec
  • Dragonfly: ~8.1M ops/sec (29x daha hızlı!)

3. 💾 Bellek Verimliliği

Sistem 100M Anahtar Anahtar Başına Tasarruf
Redis 24.5 GB 245 byte Baseline
Valkey 8.1 22 GB 220 byte %10 tasarruf
Dragonfly 17 GB 170 byte %38 tasarruf

📸 Snapshotting Karşılaştırması:

  • Redis/Valkey: Copy-on-Write kullanır, %25-50 ekstra RAM spike
  • Dragonfly: Versioning tabanlı, bellek spike'ı YOK ✅

4. 📄 JSON Desteği Detaylı Karşılaştırma

JSON Özelliği Redis 8.0 Valkey Dragonfly
Native JSON ✅ Core'da ❌ Modül gerekli ✅ Native
JSONPath Sorguları ✅ (modül ile)
JSON Indexing ✅ (modül ile)
Kurulum Kolaylığı Otomatik Manuel Otomatik

Valkey JSON Modülü Kurulumu:

git clone https://github.com/valkey-io/valkey-json
cd valkey-json
./build.sh

# valkey.conf dosyasına ekle:
loadmodule /path/to/libjson.so

# Veya runtime'da yükle:
MODULE LOAD /path/to/libjson.so

5. 🛡️ High Availability Özellikleri

HA Özelliği Redis Valkey Dragonfly
Otomatik Failover ✅ Sentinel/Cluster ✅ Geliştirilmiş ✅ Operator/Sentinel
Failover Süresi 10-30 saniye 5-15 saniye 10-20 saniye
Slot Migration Manuel/Yavaş Otomatik/Hızlı Manuel/Hızlı
Dual-Channel Replication ✅ v8.0+

6. 💰 Maliyet Analizi (AWS/GCP)

Senaryo: 100M anahtar, 1M RPS workload

Sistem Gereken Instance Aylık Maliyet Tasarruf
Redis Cluster 6x r7g.2xlarge ~$1,800 Baseline
Valkey 2x r7g.4xlarge ~$1,200 %33 tasarruf
Dragonfly 1x r7g.4xlarge ~$600 %66 tasarruf

7. 🎯 Hangi Durumda Hangisini Seçmeli?

✅ Redis'i Seçin Eğer:

  • Maksimum özellik seti gerekiyorsa (Native JSON, Vector Search, Time Series)
  • Mevcut Redis module'leri kullanılıyorsa
  • Enterprise support kritikse
  • Ekip Redis konusunda çok deneyimliyse

✅ Valkey'i Seçin Eğer:

  • Açık kaynak lisans kritikse (BSD)
  • Redis uyumluluğu önemliyse (%99+)
  • Linux Foundation desteği istiyorsanız
  • Orta-yüksek performans yeterliyse
  • JSON desteği modül olarak yeterliyse

✅ Dragonfly'ı Seçin Eğer:

  • Maksimum performans gerekiyorsa (25x)
  • Minimum maliyet hedefleniyorsa
  • Native JSON desteği önemliyse
  • Modern multi-threaded mimari istiyorsanız
  • Linear CPU scaling gerekiyorsa

8. 💪 Güçlü ve Zayıf Yönler

Redis

✅ Güçlü Yönler:

  • En geniş ekosistem
  • Native JSON, Vector Search
  • Olgun kod tabanı

❌ Zayıf Yönler:

  • Single-threaded darboğaz
  • Karmaşık lisanslama
  • Yüksek bellek kullanımı

Valkey

✅ Güçlü Yönler:

  • Tam açık kaynak
  • 3x Redis performansı
  • AWS, Google desteği

❌ Zayıf Yönler:

  • JSON modül gerekli
  • Vector Search yok
  • Henüz yeni (1 yıl)

Dragonfly

✅ Güçlü Yönler:

  • 25x performans
  • %38 daha az bellek
  • Native JSON

❌ Zayıf Yönler:

  • Küçük ekosistem
  • Module desteği yok
  • BSL lisansı

9. 🐧 Linux Production Optimizasyonları

# Kernel parametreleri (tüm sistemler için)
echo 'vm.overcommit_memory = 1' >> /etc/sysctl.conf
echo 'net.core.somaxconn = 65535' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_max_syn_backlog = 65535' >> /etc/sysctl.conf
sysctl -p

# Transparent Huge Pages kapatma
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# ulimits ayarları
ulimit -n 65535 # file descriptors

10. 📊 Sonuç ve Tavsiyeler

🏆 Final Öneriler:

1️⃣ Birinci Tercih: Valkey

  • ✅ Açık kaynak garantisi (BSD lisans)
  • ✅ Redis uyumluluğu %99+
  • ✅ Dengeli performans/özellik
  • ✅ Linux Foundation desteği

2️⃣ İkinci Tercih: Dragonfly

  • ✅ Maksimum performans gerekiyorsa
  • ✅ Minimum maliyet istiyorsanız
  • ✅ Native JSON desteği önemliyse

3️⃣ Üçüncü Tercih: Redis

  • ✅ Spesifik Redis özellikleri gerekiyorsa
  • ✅ Mevcut infrastructure varsa

📅 Rapor Tarihi: Ağustos 2025

Bu rapor, resmi benchmark sonuçları ve teknik dokümantasyonlardan derlenmiştir.

1 Ağustos 2025 Cuma

Büyük hacimli diskleri niye 512 sector ile kullanalım 4096 byte lık sector kullanabilirken !

 Günümüzde güncel linux dağıtımlarının hepsi 4096byte sector ile sorunsuz çalışmaktadır. 





Yukarıda görüldüğü gibi diskler 512/4096 byte şeklinde gelmekte, bu şekilde kullandığımızda işletim sistemleri 512 bytelık sector ler şeklinde kullanmaktadır.

Bu durumda yapacağımız işlem, üreticinin aracı veya sg_format (disk destekliyorsa) ile diske sector boyutu tamamen 4096 yaparmısın dememiz gerekiyor.

 

 

ve tüm disklerimiz artık 4096bylık sectorler halinde kullanıyoruz.

 

  4 K dan sonra disk işlem hızı, ~250MB /s çıkmış bulunuyor.

 

 

 

 

 

 

Ansible değişkenlerini doğru yerde tutmak

Ansible Değişkenlerini Doğru Yerde Tutmak Ansible · Değişkenler Ansible değişkenlerini doğru yerde tutmak Ansible'd...