Zabbix ile IT Altyapısı Envanter Yönetimi

Zabbix kurulumunu tamamladınız, host’ları eklediniz, grafikler akıyor. Peki ya envanter? Çoğu ekip bu noktada “evet, izleme var” deyip geçiyor. Ama Zabbix’in envanter yönetimi özelliği, doğru kullanıldığında ayrı bir CMDB aracına bile ihtiyaç duymayabileceğinizi gösteriyor. Ben bu yazıda size sahadan edindiğim deneyimlerle Zabbix envanter yönetimini nasıl verimli kullanabileceğinizi anlatacağım.

Zabbix Envanter Nedir, Neden Önemlidir?

Her host’un bir “Inventory” sekmesi var Zabbix’te. Çoğu kişi bunu boş bırakıyor ya da farkında bile değil. Oysa bu sekme; IP adresi, işletim sistemi, lokasyon, rack bilgisi, sorumlu kişi, seri numarası gibi onlarca alanı barındırıyor.

Şöyle düşünün: Gece 02:00’de bir sunucu alarmı geliyor. Hangi rack’te bu makine? Hangi UPS’e bağlı? Kim sorumlu? Bu bilgilere 5 dakika içinde ulaşabilmek ile Excel tablolarını karıştırmak arasındaki fark, o an çok net hissediliyor.

Zabbix envanterinin asıl gücü ise otomatik doldurma özelliğinde. Host başına elle veri girmek yerine, host’tan toplanan metriklerle envanter alanlarını otomatik besleyebilirsiniz.

Envanter Modlarını Anlamak

Zabbix’te her host için iki envanter modu var:

  • Disabled: Envanter toplanmaz. Varsayılan bu.
  • Manual: Alanları siz elle doldurursunuz.
  • Automatic: Item’lardan gelen veriler envanter alanlarını doldurur.

Eğer “Automatic” modunu seçmezseniz, item’lara envanter alanı bağlayamazsınız. Bu küçük detay, pek çok kişinin saatlerce uğraşmasına neden oluyor.

Host düzeyinde bu ayarı yapmak için:

# Zabbix API ile host envanter modunu toplu güncellemek
curl -s -X POST -H 'Content-Type: application/json' 
  -d '{
    "jsonrpc": "2.0",
    "method": "host.update",
    "params": {
        "hostid": "10084",
        "inventory_mode": 1
    },
    "auth": "YOUR_AUTH_TOKEN",
    "id": 1
  }' 
  http://zabbix.sirket.local/zabbix/api_jsonrpc.php

Burada inventory_mode için değerler:

  • -1: Disabled
  • 0: Manual
  • 1: Automatic

Yüzlerce host’u tek tek değiştirmek yerine bunu toplu yapmak için bir script yazalım.

Tüm Host’ları Toplu Güncelleme

Sahada en çok işe yarayan yöntem: mevcut tüm host’ları alıp inventory modunu otomatik’e çekmek.

#!/usr/bin/env python3
import requests
import json

ZABBIX_URL = "http://zabbix.sirket.local/zabbix/api_jsonrpc.php"
ZABBIX_USER = "Admin"
ZABBIX_PASS = "zabbix_sifresi"

def zabbix_login():
    payload = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {"user": ZABBIX_USER, "password": ZABBIX_PASS},
        "id": 1
    }
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json()["result"]

def get_all_hosts(token):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid", "host", "inventory_mode"],
            "filter": {"inventory_mode": -1}  # Sadece disabled olanlar
        },
        "auth": token,
        "id": 2
    }
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json()["result"]

def update_inventory_mode(token, hostid):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.update",
        "params": {
            "hostid": hostid,
            "inventory_mode": 1
        },
        "auth": token,
        "id": 3
    }
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json()

token = zabbix_login()
hosts = get_all_hosts(token)

for host in hosts:
    result = update_inventory_mode(token, host["hostid"])
    if "result" in result:
        print(f"[OK] {host['host']} - inventory modu güncellendi")
    else:
        print(f"[HATA] {host['host']} - {result}")

Bu script’i çalıştırdığınızda envanter modu disabled olan tüm host’lar otomatik moda geçecek.

Item’ları Envanter Alanlarına Bağlamak

Asıl sihir burada başlıyor. Zabbix’teki bir item’ın çıktısını envanter alanına bağlayabilirsiniz.

Örneğin “System uname” gibi bir item var. Bu item’ın çıktısı Linux webserver01 5.15.0-89-generic #99-Ubuntu SMP gibi bir şey döndürüyor. Bunu “OS” envanter alanına bağlayabilirsiniz.

Zabbix arayüzünde item düzenleme ekranında, “Populates host inventory field” seçeneğini bulun. Oradan istediğiniz envanter alanını seçin.

Template seviyesinde bunu yapmak çok daha mantıklı. Böylece template uygulanan tüm host’larda bu bağlantı otomatik oluşuyor. Ama kendi yazdığınız bir template’e eklemek istiyorsanız, API ile de yapabilirsiniz:

# Var olan bir item'ı envanter alanına bağlamak
curl -s -X POST -H 'Content-Type: application/json' 
  -d '{
    "jsonrpc": "2.0",
    "method": "item.update",
    "params": {
        "itemid": "29168",
        "inventory_link": 5
    },
    "auth": "YOUR_AUTH_TOKEN",
    "id": 1
  }' 
  http://zabbix.sirket.local/zabbix/api_jsonrpc.php

inventory_link numaraları Zabbix dokümantasyonunda listelenmiş. Sık kullandıklarım:

  • 1: Type (cihaz tipi)
  • 2: Type (full)
  • 3: Name
  • 4: Alias
  • 5: OS
  • 6: OS (full)
  • 11: Serial number A
  • 14: Tag
  • 23: Hardware
  • 24: Hardware (full)
  • 25: Software
  • 30: Contact
  • 31: Location
  • 32: Location latitude
  • 33: Location longitude

Gerçek Dünya Senaryosu: Linux Sunucu Envanteri

Bir müşterimizde 200’ü aşkın Linux sunucu vardı. Hiçbirinin envanter bilgisi yoktu. Excel tablosu yıllarca güncellenmemişti. Şu item’larla otomatik envanter oluşturduk:

İşletim sistemi için:

# Bu komutun çıktısını Zabbix'e göndermek için UserParameter kullanıyoruz
# /etc/zabbix/zabbix_agentd.conf.d/inventory.conf

UserParameter=inventory.os.full,cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2
UserParameter=inventory.kernel,uname -r
UserParameter=inventory.cpu.model,grep "model name" /proc/cpuinfo | head -1 | awk -F': ' '{print $2}'
UserParameter=inventory.ram.total,free -m | awk '/^Mem:/{print $2" MB"}'
UserParameter=inventory.serial,sudo dmidecode -s system-serial-number 2>/dev/null || echo "N/A"
UserParameter=inventory.manufacturer,sudo dmidecode -s system-manufacturer 2>/dev/null || echo "N/A"
UserParameter=inventory.product,sudo dmidecode -s system-product-name 2>/dev/null || echo "N/A"

Bu satırları agent config dosyasına ekledikten sonra agent’ı yeniden başlatın:

systemctl restart zabbix-agent
# Test etmek için:
zabbix_agentd -t inventory.os.full
zabbix_agentd -t inventory.serial

Zabbix arayüzünde bu key’leri kullanarak item’lar oluşturun ve her birini ilgili envanter alanına bağlayın. Type: Zabbix agent, Key: inventory.os.full, Populates host inventory field: OS (Full) şeklinde.

Template Seviyesinde Envanter Otomasyonu

El işinin azaldığı yer burası. Kendi Linux Inventory template’inizi oluşturun, içine bu item’ları ekleyin, ve bu template’i Linux grubundaki tüm host’lara uygulayın. Artık yeni bir Linux sunucu eklediğinizde envanter otomatik dolmaya başlıyor.

Template export/import için:

# Mevcut template'i XML olarak dışa aktarmak
curl -s -X POST -H 'Content-Type: application/json' 
  -d '{
    "jsonrpc": "2.0",
    "method": "configuration.export",
    "params": {
        "options": {
            "templates": ["10001"]
        },
        "format": "xml"
    },
    "auth": "YOUR_AUTH_TOKEN",
    "id": 1
  }' 
  http://zabbix.sirket.local/zabbix/api_jsonrpc.php | 
  python3 -c "import sys,json; print(json.load(sys.stdin)['result'])" > linux_inventory_template.xml

Envanter Verilerini Raporlamak

Envanter doldu, peki bu verileri nasıl kullanacaksınız? Zabbix arayüzünde Inventory > Hosts menüsüne gidin. Burada tüm envanter verilerini filtreleyebilirsiniz. Ama sahada genelde bu yeterli olmuyor. Dışa aktarma lazım oluyor.

API ile tüm envanter verilerini çekmek:

#!/usr/bin/env python3
import requests
import csv
import sys

ZABBIX_URL = "http://zabbix.sirket.local/zabbix/api_jsonrpc.php"

def zabbix_login(url, user, password):
    payload = {
        "jsonrpc": "2.0",
        "method": "user.login",
        "params": {"user": user, "password": password},
        "id": 1
    }
    r = requests.post(url, json=payload)
    return r.json()["result"]

def get_inventory_report(token):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["hostid", "host", "name"],
            "selectInventory": "extend",
            "selectInterfaces": ["ip"],
            "filter": {"status": 0},
            "sortfield": "host"
        },
        "auth": token,
        "id": 2
    }
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json()["result"]

token = zabbix_login(ZABBIX_URL, "Admin", "sifreni_buraya_yaz")
hosts = get_inventory_report(token)

with open("zabbix_inventory.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerow([
        "Hostname", "IP Adresi", "İşletim Sistemi",
        "Donanım", "Seri No", "Lokasyon",
        "Sorumlu Kişi", "Tag"
    ])
    
    for host in hosts:
        inv = host.get("inventory", {}) or {}
        ip = host["interfaces"][0]["ip"] if host.get("interfaces") else "N/A"
        
        writer.writerow([
            host["host"],
            ip,
            inv.get("os_full", ""),
            inv.get("hardware_full", ""),
            inv.get("serialno_a", ""),
            inv.get("location", ""),
            inv.get("contact", ""),
            inv.get("tag", "")
        ])

print(f"Rapor oluşturuldu: zabbix_inventory.csv ({len(hosts)} host)")

Bu script’i cron’a ekleyip haftalık otomatik rapor oluşturabilirsiniz:

# Crontab -e ile ekleyin
0 8 * * 1 /opt/scripts/zabbix_inventory_export.py >> /var/log/zabbix_inventory.log 2>&1

Windows Sunucular İçin Envanter

Linux tarafını hallettik ama Windows ortamlarında da benzer ihtiyaç var. Windows Zabbix Agent ile WMI üzerinden envanter toplayabilirsiniz.

# Windows agent için UserParameter'lar
# C:Program FilesZabbix Agentzabbix_agentd.conf dosyasına ekleyin

UserParameter=inventory.os.win,powershell -NoProfile -Command "(Get-WmiObject Win32_OperatingSystem).Caption"
UserParameter=inventory.serial.win,powershell -NoProfile -Command "(Get-WmiObject Win32_BIOS).SerialNumber"
UserParameter=inventory.manufacturer.win,powershell -NoProfile -Command "(Get-WmiObject Win32_ComputerSystem).Manufacturer"
UserParameter=inventory.model.win,powershell -NoProfile -Command "(Get-WmiObject Win32_ComputerSystem).Model"
UserParameter=inventory.ram.win,powershell -NoProfile -Command "[math]::Round((Get-WmiObject Win32_ComputerSystem).TotalPhysicalMemory/1GB,2).ToString() + ' GB'"

Zabbix Agent 2 kullanıyorsanız, WMI item’larını daha temiz şekilde kullanabilirsiniz. Ama büyük ortamlarda PowerShell tabanlı UserParameter’lar daha esnek.

Envanter Verisiyle Dinamik Host Grupları

Bu özelliği çok az kişi kullanıyor ama inanılmaz işe yarıyor. Zabbix’te host group oluştururken “Dinamik” seçeneği var. Envanter alanlarına göre host’ları otomatik gruplara atayabilirsiniz.

Örneğin, lokasyon alanı “Istanbul-DC1” olan tüm sunucular otomatik olarak “Istanbul-DC1” grubuna girebilir. Bunu Zabbix API ile yapılandırmak:

# Inventory bilgisine göre host'ları sorgula
curl -s -X POST -H 'Content-Type: application/json' 
  -d '{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
        "output": ["hostid", "host"],
        "searchInventory": {
            "location": "Istanbul-DC1"
        }
    },
    "auth": "YOUR_AUTH_TOKEN",
    "id": 1
  }' 
  http://zabbix.sirket.local/zabbix/api_jsonrpc.php

searchInventory parametresiyle herhangi bir envanter alanına göre host listesi çekebilirsiniz. Bu özelliği Ansible playbook’larınızla da entegre edebilirsiniz; Zabbix envanterini dynamic inventory olarak kullanabilirsiniz.

Sık Karşılaşılan Sorunlar ve Çözümleri

Sahada en çok şunu gördüm: item çalışıyor, envanter alanına bağlı, ama veri gelmiyor. Neden?

  • Host inventory modu “Automatic” değil: İlk kontrol edin.
  • Item type uyumsuzluğu: Numeric (float) tipindeki bir item’ı metin alanına bağlayamazsınız. Item tipini “Text” veya “Character” yapın.
  • Item henüz veri toplamadı: Bir sonraki polling cycle’ı bekleyin ya da “Execute now” deneyin.
  • Aynı envanter alanına birden fazla item bağlı: Bu çakışmaya neden olur. Her alana yalnızca bir item bağlayın.

Hata ayıklarken Zabbix server loglarına bakın:

tail -f /var/log/zabbix/zabbix_server.log | grep -i inventory
# Ya da agent loglarına:
tail -f /var/log/zabbix/zabbix_agentd.log | grep -i "inventory|UserParameter"

Envanter Verilerini Harici Araçlarla Senkronize Etmek

Bazı ortamlarda GLPI, Snipe-IT veya ServiceNow gibi ITAM araçları var. Zabbix envanteri bu araçlarla senkronize etmek mümkün.

Örneğin Snipe-IT ile basit bir senkronizasyon:

#!/usr/bin/env python3
import requests

ZABBIX_URL = "http://zabbix.sirket.local/zabbix/api_jsonrpc.php"
SNIPEIT_URL = "http://snipeit.sirket.local/api/v1"
SNIPEIT_TOKEN = "Bearer YOUR_SNIPEIT_TOKEN"

def get_zabbix_inventory(zabbix_token):
    payload = {
        "jsonrpc": "2.0",
        "method": "host.get",
        "params": {
            "output": ["host"],
            "selectInventory": ["serialno_a", "os_full", "hardware_full", "location"],
            "filter": {"status": 0}
        },
        "auth": zabbix_token,
        "id": 1
    }
    r = requests.post(ZABBIX_URL, json=payload)
    return r.json()["result"]

def create_or_update_snipeit(asset_data):
    headers = {
        "Authorization": SNIPEIT_TOKEN,
        "Content-Type": "application/json",
        "Accept": "application/json"
    }
    # Önce seri no ile ara
    search = requests.get(
        f"{SNIPEIT_URL}/hardware/byserial/{asset_data['serial']}",
        headers=headers
    )
    
    payload = {
        "name": asset_data["name"],
        "serial": asset_data["serial"],
        "notes": f"OS: {asset_data['os']} | HW: {asset_data['hw']}"
    }
    
    if search.status_code == 200 and search.json().get("total", 0) > 0:
        asset_id = search.json()["rows"][0]["id"]
        requests.patch(f"{SNIPEIT_URL}/hardware/{asset_id}", headers=headers, json=payload)
        print(f"[GÜNCELLENDI] {asset_data['name']}")
    else:
        print(f"[ATLANDI] {asset_data['name']} - seri no bulunamadı veya yeni kayıt gerekiyor")

# Ana akış
# token = zabbix_login()
# hosts = get_zabbix_inventory(token)
# for host in hosts:
#     inv = host.get("inventory", {}) or {}
#     if inv.get("serialno_a"):
#         create_or_update_snipeit({...})

Bu script’i production’da kullanmadan önce test ortamında deneyin ve her iki sistemde de değişiklikleri loglayın.

Sonuç

Zabbix envanter yönetimi, doğru kurgulandığında ayrı bir asset management aracına olan ihtiyacı ciddi ölçüde azaltıyor. En kritik adımlar şunlar:

  • Host’larda inventory modunu “Automatic” olarak ayarlamak
  • Template seviyesinde envanter item’ları oluşturmak, böylece her yeni host otomatik kapsama giriyor
  • UserParameter’larla cihaza özgü verileri (seri no, donanım bilgisi) toplamak
  • Periyodik rapor scriptleriyle envanter verilerini yönetilebilir tutmak

Gece 02:00 alarmına döneceğim: envanter doğru kurgulandığında o panik anı çok daha kontrollü geçiyor. Hangi rack, hangi UPS, kim sorumlu, işletim sistemi neydi, aynı anda hepsine bakıyorsunuz. Monitoring araçları sadece alarm vermez, bilgi taşır. Zabbix envanteri de bu bilgiyi yapılandırılmış hale getirmenin en pratik yollarından biri.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir