Zabbix’te Host ve Host Group Oluşturma

Zabbix kurulumunu tamamladınız, arayüz açık, servisler ayakta. Şimdi ne yapacaksınız? Büyük ihtimalle ekranın ortasında duran boş “Hosts” listesine bakıp “nereden başlayayım” diye düşünüyorsunuzdur. Bu yazıda tam olarak o noktadan başlayacağız: host ve host group kavramlarını, doğru yapılandırmanın neden önemli olduğunu ve production ortamında işe yarayan pratik örnekleri ele alacağız.

Host ve Host Group Nedir, Neden Önemlidir?

Zabbix’te host, izlemek istediğiniz herhangi bir varlıktır. Fiziksel sunucu, sanal makine, network cihazı, hatta bir uygulama endpoint’i bile host olarak tanımlanabilir. Host group ise bu varlıkları mantıksal olarak gruplandırmanıza yarayan yapıdır.

Buradaki kritik nokta şu: host group yapısını baştan doğru kurmazsanız, ilerleyen dönemde template atama, kullanıcı izinleri ve tetikleyici yönetimi ciddi bir kaosa dönüşür. Onlarca sunucuyu “Linux Servers” gibi tek bir gruba koyup sonradan “neden herkes her şeyi görebiliyor” diye sorgulayanları çok gördüm. Bu yüzden yapıyı baştan planlamak, sonradan saatler harcamaktan çok daha değerlidir.

Host Group Yapısını Planlamak

Gruplama stratejinizi belirlemeden önce şu soruları yanıtlamanız gerekiyor:

  • Altyapınız ortama göre mi ayrılacak (prod/test/dev)?
  • İşletim sistemine göre mi gruplandıracaksınız (Linux, Windows)?
  • Uygulama rolüne göre mi (web sunucuları, veritabanları)?
  • Lokasyona göre mi (İstanbul DC, Ankara DR)?

Gerçek hayatta bu yapıların kombinasyonu en sağlıklı sonucu verir. Bir sunucu birden fazla gruba dahil olabilir, bu özelliği aktif kullanın.

Örnek bir gruplama şeması:

  • Linux/Production: Production ortamındaki tüm Linux sunucuları
  • Linux/Test: Test ortamındaki Linux makineler
  • Windows/Production: Production Windows sunucuları
  • Database/MySQL: MySQL sunucuları, ortamdan bağımsız
  • Database/PostgreSQL: PostgreSQL sunucuları
  • Web/Nginx: Nginx çalışan web sunucuları
  • Network/Core: Core network cihazları
  • Application/ERP: ERP uygulaması çalışan sunucular

Bu yapıda bir production MySQL sunucusu hem “Linux/Production” hem de “Database/MySQL” grubunda yer alabilir. Template atarken “Database/MySQL” grubuna MySQL template’i, “Linux/Production” grubuna da genel Linux template’ini atarsınız.

Zabbix API ile Host Group Oluşturma

Arayüzden tek tek tıklamak yerine API kullanmak hem tekrarlanabilir hem de scriptlenebilir bir altyapı yönetimi sağlar. Özellikle onlarca grup oluşturacaksanız bu yöntem hayat kurtarır.

Önce authentication token alın:

curl -s -X POST http://zabbix.sirket.local/zabbix/api_jsonrpc.php 
  -H "Content-Type: application/json" 
  -d '{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "username": "Admin",
      "password": "zabbix"
    },
    "id": 1
  }' | python3 -m json.tool

Token aldıktan sonra host group oluşturma:

TOKEN="buraya_token_gelecek"

curl -s -X POST http://zabbix.sirket.local/zabbix/api_jsonrpc.php 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "hostgroup.create",
    "params": {
      "name": "Linux/Production"
    },
    "auth": "$TOKEN",
    "id": 2
  }" | python3 -m json.tool

Birden fazla grubu toplu oluşturmak için basit bir script yazalım:

#!/bin/bash

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

# Token al
TOKEN=$(curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "user.login",
    "params": {
      "username": "$ZABBIX_USER",
      "password": "$ZABBIX_PASS"
    },
    "id": 1
  }" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")

echo "Token alindi: $TOKEN"

# Grup listesi
GROUPS=("Linux/Production" "Linux/Test" "Linux/Dev" "Windows/Production" 
        "Database/MySQL" "Database/PostgreSQL" "Web/Nginx" "Network/Core")

for GROUP in "${GROUPS[@]}"; do
  RESULT=$(curl -s -X POST "$ZABBIX_URL" 
    -H "Content-Type: application/json" 
    -d "{
      "jsonrpc": "2.0",
      "method": "hostgroup.create",
      "params": {
        "name": "$GROUP"
      },
      "auth": "$TOKEN",
      "id": 2
    }")
  
  GROUPID=$(echo $RESULT | python3 -c "import sys,json; data=json.load(sys.stdin); print(data['result']['groupids'][0])" 2>/dev/null)
  
  if [ -n "$GROUPID" ]; then
    echo "Grup olusturuldu: $GROUP (ID: $GROUPID)"
  else
    echo "HATA: $GROUP grubu olusturulamadi"
    echo $RESULT
  fi
done

Arayüzden Host Group Oluşturma

API ile uğraşmak istemeyenler veya tek seferlik işlemler için arayüz yeterlidir. Zabbix 6.x ve üzeri için adımlar:

Data collection > Host groups menüsüne gidin. Sağ üstteki Create host group butonuna tıklayın. Açılan formda:

  • Group name: Grubun adını girin. Hiyerarşik yapı için “/” ayracı kullanın (örneğin “Linux/Production”)
  • Apply permissions and tag filters to all subgroups: Bu seçenek önemli, eğer “Linux” gibi bir üst grup oluşturduktan sonra alt gruplara otomatik izin yaymak istiyorsanız bu seçeneği işaretleyin

Kaydedin, grup hazır.

Zabbix Agent ile Host Ekleme

Şimdi asıl işe gelelim: host ekleme. En yaygın senaryo, Linux sunucularınıza Zabbix agent kurulu ve sunucuyu active ya da passive modda izlemek istiyorsunuz.

Önce izlenecek sunucuya Zabbix agent kurun (Ubuntu/Debian için):

# Zabbix repository ekle
wget https://repo.zabbix.com/zabbix/6.4/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.4-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.4-1+ubuntu22.04_all.deb
apt update

# Agent kur
apt install -y zabbix-agent2

# Konfigürasyonu ayarla
cat > /etc/zabbix/zabbix_agent2.conf << 'EOF'
PidFile=/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=10.0.1.50
ServerActive=10.0.1.50
Hostname=web01.prod.sirket.local
HostMetadata=linux production web nginx
EOF

systemctl enable zabbix-agent2
systemctl start zabbix-agent2
systemctl status zabbix-agent2

Burada HostMetadata parametresine dikkat edin. Auto-registration kullanıyorsanız bu metadata üzerinden otomatik grup ve template ataması yapabilirsiniz, bunu ilerleyen kısımda göreceğiz.

API ile Host Ekleme

Host grubunuzun ID’sini ve kullanmak istediğiniz template ID’sini öğrendikten sonra API ile host ekleyebilirsiniz:

#!/bin/bash

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

# Grubun ID'sini bul
GROUP_ID=$(curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "hostgroup.get",
    "params": {
      "filter": {"name": ["Linux/Production"]}
    },
    "auth": "$TOKEN",
    "id": 1
  }" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'][0]['groupid'])")

echo "Grup ID: $GROUP_ID"

# Template ID'sini bul
TEMPLATE_ID=$(curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "template.get",
    "params": {
      "filter": {"host": ["Linux by Zabbix agent"]}
    },
    "auth": "$TOKEN",
    "id": 2
  }" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'][0]['templateid'])")

echo "Template ID: $TEMPLATE_ID"

# Host ekle
curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "host.create",
    "params": {
      "host": "web01.prod.sirket.local",
      "name": "Web-01 Production",
      "interfaces": [
        {
          "type": 1,
          "main": 1,
          "useip": 1,
          "ip": "10.0.1.101",
          "dns": "",
          "port": "10050"
        }
      ],
      "groups": [
        {"groupid": "$GROUP_ID"}
      ],
      "templates": [
        {"templateid": "$TEMPLATE_ID"}
      ],
      "inventory_mode": 1,
      "inventory": {
        "location": "Istanbul-DC1",
        "os": "Ubuntu 22.04"
      }
    },
    "auth": "$TOKEN",
    "id": 3
  }" | python3 -m json.tool

Toplu Host Import: CSV’den Zabbix’e

Onlarca sunucuyu tek tek eklemek yerine CSV dosyasından okuyup toplu ekleyen bir script çok daha pratik:

#!/bin/bash
# hosts.csv formatı: hostname,ip,group,template,location
# Örnek: db01.prod.local,10.0.2.10,Database/MySQL,MySQL by Zabbix agent,Istanbul-DC1

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

# Token al
TOKEN=$(curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d '{"jsonrpc":"2.0","method":"user.login","params":{"username":"Admin","password":"zabbix_pass"},"id":1}' 
  | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])")

while IFS=',' read -r HOSTNAME IP GROUP TEMPLATE LOCATION; do
  # Yorum satırlarını atla
  [[ "$HOSTNAME" =~ ^#.*$ ]] && continue
  [[ -z "$HOSTNAME" ]] && continue

  # Grup ID al veya oluştur
  GROUP_ID=$(curl -s -X POST "$ZABBIX_URL" 
    -H "Content-Type: application/json" 
    -d "{"jsonrpc":"2.0","method":"hostgroup.get","params":{"filter":{"name":["$GROUP"]}},"auth":"$TOKEN","id":1}" 
    | python3 -c "import sys,json; r=json.load(sys.stdin)['result']; print(r[0]['groupid'] if r else '')" 2>/dev/null)

  if [ -z "$GROUP_ID" ]; then
    echo "UYARI: $GROUP grubu bulunamadi, atlaniyor: $HOSTNAME"
    continue
  fi

  # Template ID al
  TEMPLATE_ID=$(curl -s -X POST "$ZABBIX_URL" 
    -H "Content-Type: application/json" 
    -d "{"jsonrpc":"2.0","method":"template.get","params":{"filter":{"host":["$TEMPLATE"]}},"auth":"$TOKEN","id":1}" 
    | python3 -c "import sys,json; r=json.load(sys.stdin)['result']; print(r[0]['templateid'] if r else '')" 2>/dev/null)

  # Host ekle
  RESULT=$(curl -s -X POST "$ZABBIX_URL" 
    -H "Content-Type: application/json" 
    -d "{"jsonrpc":"2.0","method":"host.create","params":{"host":"$HOSTNAME","interfaces":[{"type":1,"main":1,"useip":1,"ip":"$IP","dns":"","port":"10050"}],"groups":[{"groupid":"$GROUP_ID"}],"templates":[{"templateid":"$TEMPLATE_ID"}],"inventory_mode":1,"inventory":{"location":"$LOCATION"}},"auth":"$TOKEN","id":2}")

  HOST_ID=$(echo $RESULT | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['result']['hostids'][0])" 2>/dev/null)

  if [ -n "$HOST_ID" ]; then
    echo "OK: $HOSTNAME eklendi (ID: $HOST_ID)"
  else
    echo "HATA: $HOSTNAME eklenemedi"
  fi

done < "$CSV_FILE"

echo "Islem tamamlandi."

Auto-Registration ile Otomatik Host Ekleme

Bu özelliği bir kez doğru kurduğunuzda hayatınız kolaylaşır. Yeni bir sunucu eklediğinizde agent’ı yapılandırıp servisi başlatmanız yeterli, Zabbix otomatik olarak hostu ekler, gruba dahil eder ve template atar.

Bunun için önce Configuration > Actions > Autoregistration actions altında yeni bir action oluşturun. Action koşulu olarak “Host metadata contains linux” gibi bir kural ekleyin. Ardından operations kısmında:

  • Add host: Hostu sisteme ekle
  • Add to host groups: Belirttiğiniz gruba ekle
  • Link to templates: Template ata
  • Enable host: Hostu aktif et

Agent tarafında metadata’yı şöyle ayarlayabilirsiniz. Örneğin bu sunucu bir production nginx sunucusuysa:

# /etc/zabbix/zabbix_agent2.conf
Server=10.0.1.50
ServerActive=10.0.1.50
Hostname=web03.prod.sirket.local
HostMetadata=linux production nginx

Action’da “Host metadata contains production” ve “Host metadata contains nginx” koşullarını birlikte kullanarak hem “Linux/Production” hem “Web/Nginx” grubuna otomatik ekleme yapabilirsiniz.

Host Durumunu ve Bağlantısını Doğrulama

Host eklendikten sonra gerçekten veri gelip gelmediğini kontrol etmek için:

# Agent tarafında Zabbix sunucusuna bağlantıyı test et
zabbix_agent2 -t system.uptime

# Zabbix sunucusundan agent'a bağlantıyı test et
zabbix_get -s 10.0.1.101 -p 10050 -k system.uptime

# Agent log'larına bak
tail -f /var/log/zabbix/zabbix_agent2.log

# Firewall kontrolü (sunucu tarafında 10050 portunu açın)
ufw allow from 10.0.1.50 to any port 10050
# veya
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.50" port protocol="tcp" port="10050" accept'
firewall-cmd --reload

Zabbix arayüzünde host’un “ZBX” ikonu yeşil yanıyorsa agent bağlantısı sağlıklıdır. Gri veya kırmızıysa agent erişilemiyor demektir.

Host Gruplarına İzin Yönetimi

Host group yapısının en kritik kullanım alanlarından biri izin yönetimidir. Örneğin database ekibinin sadece database sunucularını görmesini istiyorsunuz:

Administration > User groups altında “Database Team” adında bir kullanıcı grubu oluşturun. Permissions sekmesine geçip:

  • Host group: Database/MySQL, Database/PostgreSQL
  • Permission: Read (sadece görüntüleme) veya Read-Write (değişiklik yapabilsin)

Artık bu gruba dahil kullanıcılar sadece database host gruplarını görebilecek, diğer sunuculara erişemeyecek.

Dikkat etmeniz gereken nokta şu: bir kullanıcının bir hostu görebilmesi için, o hostun dahil olduğu en az bir gruba o kullanıcının erişim izni olması gerekir. Bu yüzden bir host mutlaka bir gruba dahil olmalıdır, gruba dahil olmayan host hiçbir kullanıcı tarafından görüntülenemez.

Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler

Yıllar içinde en çok karşılaştığım sorunları paylaşayım:

  • Hostname tutarsızlığı: Zabbix’teki hostname ile agent config’indeki “Hostname” değeri birebir eşleşmek zorundadır. Büyük/küçük harf duyarlıdır. “Web01” ile “web01” farklı host olarak algılanır.
  • DNS vs IP tercihini karıştırmak: Arayüzden host eklerken “Connect to DNS” seçerseniz Zabbix sunucusunun o DNS adını çözebilmesi gerekir. Production ortamında IP kullanmak daha güvenlidir.
  • Template çakışması: Bir hosta iki farklı template’den gelen aynı item key’ini atarsanız veri toplama sorunları yaşarsınız. Template’leri dikkatlice seçin.
  • Gruba dahil olmayan host: Yukarıda bahsettiğim gibi, her host mutlaka en az bir gruba dahil olmalıdır. “Ungrouped Hosts” şeklinde geçici bir grup oluşturmak iyi bir pratiktir, orphan host kalmasın diye.
  • Passive vs Active agent karışıklığı: Passive modda Zabbix sunucusu agent’a bağlanır (10050 portu), active modda agent sunucuya bağlanır (10051 portu). Firewall kurallarınızı buna göre yapılandırın.

Mevcut Hostları Listeleme ve Yönetme

API ile tüm hostlarınızı ve hangi gruplarda olduklarını raporlamak için:

#!/bin/bash
ZABBIX_URL="http://zabbix.sirket.local/zabbix/api_jsonrpc.php"
TOKEN="token_buraya"

curl -s -X POST "$ZABBIX_URL" 
  -H "Content-Type: application/json" 
  -d "{
    "jsonrpc": "2.0",
    "method": "host.get",
    "params": {
      "output": ["hostid", "host", "name", "status"],
      "selectGroups": ["name"],
      "selectInterfaces": ["ip", "port"],
      "selectTemplates": ["name"]
    },
    "auth": "$TOKEN",
    "id": 1
  }" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for host in data['result']:
    gruplar = [g['name'] for g in host['groups']]
    templateler = [t['name'] for t in host['templates']]
    ip = host['interfaces'][0]['ip'] if host['interfaces'] else 'N/A'
    durum = 'Aktif' if host['status'] == '0' else 'Pasif'
    print(f"Host: {host['host']}")
    print(f"  IP: {ip}")
    print(f"  Durum: {durum}")
    print(f"  Gruplar: {', '.join(gruplar)}")
    print(f"  Templateler: {', '.join(templateler)}")
    print()
"

Sonuç

Zabbix’te host ve host group yönetimi, izleme altyapınızın temel iskeleti. Başta “nasıl olsa değiştiririm” deyip geçiştirilen bu yapı, ilerleyen süreçte yüzlerce sunucuya ulaştığınızda ciddi sorunlara yol açabilir. Şimdi anlattığım gruplama stratejisini uygularsanız, template atama, kullanıcı izinleri ve alert yönetimi çok daha kolay hale gelir.

API ile yapılan işlemleri scriptleyin ve bu scriptleri Git’e koyun. Altı ay sonra kim ne ekledi, hangi sunucu neden şu gruba alındı gibi sorulara kolayca yanıt verebilirsiniz. Auto-registration özelliğini aktif kullanın, özellikle dinamik altyapılarda (bulut, container ortamları) yeni oluşan sunucuların otomatik eklenmesi büyük kolaylık sağlar.

Bir sonraki adım olarak host gruplarınıza template atamayı ve custom item tanımlamayı ele alacağız. O konuya geçmeden önce mevcut host yapınızı gözden geçirip temizlemenizi tavsiye ederim; temiz bir temel üstüne inşa etmek her zaman daha sağlıklıdır.

Bir yanıt yazın

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