Czym jest Zabbix i Terraform oraz jak działa ich integracja?
Czym jest Zabbix?
Zabbix to system klasy monitoring / observability służący do:
- monitorowania serwerów Linux/Windows
- urządzeń sieciowych
- aplikacji
- baz danych
- środowisk wirtualnych i chmurowych
Działa w modelu:
- Zabbix Server
- Zabbix Agent (na hostach)
- komunikacja przez API
Umożliwia:
- zbieranie metryk (CPU, RAM, dysk)
- definiowanie triggerów
- generowanie alertów (mail, webhook)
- tworzenie dashboardów
Czym jest Terraform?
Terraform to narzędzie Infrastructure as Code (IaC), które:
- tworzy i zarządza infrastrukturą z poziomu kodu (HCL),
- komunikuje się z API systemów (cloud, hypervisory, monitoring),
- umożliwia wersjonowanie infrastruktury w Git.
Workflow:
terraform init
terraform plan
terraform apply
Połączenie Terraform + Zabbix
Integracja odbywa się przez provider Zabbix, który wykorzystuje API Zabbixa.
Schemat działania:
- Terraform łączy się z API Zabbix.
- Tworzy zasoby typu:
- host
- grupa
- template
- trigger
- akcja
- Konfiguracja monitoringu staje się „Monitoring as Code”.
Struktura plików (na podstawie Twoich plików)
Zakładamy strukturę:
provider.tf
versions.tf
main.tf
versions.tf – definicja providera REST
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "~> 1.19"
}
}
}
Co robi ten plik?
- Pobiera provider
Mastercard/restapiz Terraform Registry. - Blokuje wersję w zakresie 1.x.
- Zapewnia kompatybilność projektu.
Ten provider jest uniwersalny – umożliwia wysyłanie żądań HTTP do dowolnego API REST/JSON.
provider.tf – konfiguracja połączenia z API Zabbixa
provider "restapi" {
uri = "http://192.168.1.50/zabbix/api_jsonrpc.php"
write_returns_object = true
headers = {
"Content-Type" = "application/json"
"Authorization" = "Bearer Twoj_token"
}
}
Co oznaczają poszczególne parametry?
uri
Endpoint API Zabbixa:
/zabbix/api_jsonrpc.php
Zabbix używa protokołu JSON-RPC 2.0.
write_returns_object = true
Informuje Terraform, że odpowiedź API będzie zawierała obiekt JSON, który może zostać zapisany w stanie (terraform.tfstate).
headers
Ustawia nagłówki HTTP:
Content-Type = application/jsonAuthorization = Bearer Twoj_token
W tym przypadku autoryzacja odbywa się poprzez token API (zalecane podejście zamiast login/hasło).
main.tf – tworzenie zasobów w Zabbixie przez JSON-RPC
Provider REST nie posiada dedykowanych zasobów typu zabbix_host, dlatego korzystamy z:
restapi_object
Tworzenie grupy hostów
resource "restapi_object" "web_servers_group" {
path = "/"
data = jsonencode({
jsonrpc = "2.0"
method = "hostgroup.create"
params = { name = "Web Servers" }
id = 1
})
}
Co się dzieje?
Terraform wysyła POST do API z payloadem:
method = "hostgroup.create"- tworzy grupę: Web Servers
jsonencode() konwertuje strukturę HCL na JSON.
Tworzenie hosta „Wazuh”
resource "restapi_object" "wazuh_host" {
path = "/"
data = jsonencode({
jsonrpc = "2.0"
method = "host.create"
params = {
host = "Wazuh"
name = "Wazuh"
interfaces = [{
type = 1
main = 1
useip = 1
ip = "192.168.1.77"
dns = ""
port = "10050"
}]
groups = [
{ groupid = "2" }
]
templates = [
{ templateid = "10001" }
]
}
id = 2
})
}
Analiza parametrów
method = "host.create"
Wywołanie metody API Zabbixa odpowiedzialnej za tworzenie hosta.
interfaces
type = 1 → Zabbix Agent
main = 1 → główny interfejs
useip = 1 → użyj IP zamiast DNS
ip = 192.168.1.77
port = 10050
Uwaga: tutaj wartości 1 są poprawne, ponieważ są przekazywane bezpośrednio do API Zabbixa, które oczekuje typu integer, a nie boolean (w przeciwieństwie do dedykowanego providera).
groups
{ groupid = "2" }
Host zostaje przypisany do grupy o ID 2.
templates
{ templateid = "10001" }
Host otrzymuje template o określonym ID (np. Linux by Zabbix agent).
Co dzieje się podczas terraform apply?
- Terraform wysyła żądanie
hostgroup.create - Tworzy grupę Web Servers
- Wysyła żądanie
host.create - Tworzy hosta Wazuh
- Przypisuje interfejs, grupę i template
Całość odbywa się bez użycia GUI.
Zalety tego podejścia
1. Pełna kontrola nad API
Można wywołać dowolną metodę Zabbixa:
- trigger.create
- action.create
- item.create
- user.create
2. Niezależność od dedykowanego providera
Działa nawet jeśli provider Zabbix nie wspiera danej funkcji.
3. Uniwersalność
Ten sam mechanizm można zastosować do:
- Wazuh
- innych systemów REST
- własnych API
Instalacja i konfiguracja
Cel środowiska
Zbudowanie środowiska testowego, w którym:
- 1 serwer pełni rolę Zabbix Server
- 1 serwer pełni rolę Terraform Runner
- 1 serwer Linux z zainstalowanym Wazuh
Całość zostanie połączona przez API Zabbix i zarządzana przez Terraform.
Instalacja Zabbix Server (Linux-1)
Krok 1 – instalacja repozytorium
Zaloguj się na serwer i zainstaluj Zabbix agent na serwerze (w moim przypadku Wazuh). Może to być dowolny serwer Ubuntu.
wget https://repo.zabbix.com/zabbix/7.4/release/ubuntu/pool/main/z/zabbix-release/zabbix-release_latest_7.4+ubuntu24.04_all.deb
dpkg -i zabbix-release_latest_7.4+ubuntu24.04_all.deb
apt update
apt install zabbix-agent -y
systemctl restart zabbix-agent
systemctl enable zabbix-agent


Konfiguracja zabbix agent
Edytuj plik zabbix_agentd.conf
nano /etc/zabbix/zabbix_agentd.conf

W edytowanym pliku znajdź sekcję server= i zmień adres IP na adres Twojego serwera Zabbix (w moim przypadku jest to 192.168.1.50)
Znajdź sekcję ServerActive=127.0.0.1 i dodaj przed nią znak „#„
Zmień również serkcję Hostname=, tutaj podaj nazwę hosta (powinna się zgadzać z późniejszą konfiguracją w Terraform, w pliku main.tf)
Po zapisaniu pliku. Restart zabbix agenta, komendą:
service zabbix-agent restart
Instalacja Terraform (Linux-2)
Zaloguj się na serwer i zainstaluj Terraform
apt update
apt install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
apt update
apt-get install terraform -y


Sprawdź zainstalowaną wersję Terraform (na czas pisania artykułu, mamy wersję 1.14.6)
terraform -v

Zaloguj się do Zabbix. Potrzebujemy wygenerować klucz API dla połączenia z Terraform. Przejdź do sekcji Users / API tokens
Kliknij w Create API token. W sekcji name, nadaj nazwę tokena np. terraform, w sekcji User, wybierz Admin (Zabbix Administrator). W sekcji Expires at, wybierz datę kiedy ma wygasnąć token i finalnie kliknij Add
Skopiuj i zapisz Auth token: np. w notatniku, kliknij Close
Przejdź do serwera z zainstalowanym Terraform, utwórz trzy pliki provider.tf, versions.tf oraz main.tf
Plik provider.tf:
nano provider.tf
provider „restapi” {
uri = „http://Adres_IP_serwera_zabbix/zabbix/api_jsonrpc.php”
write_returns_object = true
headers = {
„Content-Type” = „application/json”
„Authorization” = „Bearer Twój_token”
}
}
Plik versions.tf:
nano versions.tf
terraform {
required_providers {
restapi = {
source = "Mastercard/restapi"
version = "~> 1.19"
}
}
}
Plik main.tf:
nano main.tf
resource "restapi_object" "web_servers_group" {
path = "/"
data = jsonencode({
jsonrpc = "2.0"
method = "hostgroup.create"
params = { name = "Web Servers" }
id = 1
})
}
resource "restapi_object" "wazuh_host" {
path = "/"
data = jsonencode({
jsonrpc = "2.0"
method = "host.create"
params = {
host = "Wazuh"
name = "Wazuh"
interfaces = [{
type = 1
main = 1
useip = 1
ip = "192.168.1.77"
dns = ""
port = "10050"
}]
groups = [
{ groupid = "2" }
]
templates = [
{ templateid = "10001" }
]
}
id = 2
})
}
Teraz przetestujmy wyniki naszej pracy. Przejdź do Zabbix, następnie do sekcji Data collection / Hosts
Zauważ nie mam jeszcze serwera Wazuh
Przejdź do serwera Terraform, wprowadź komendę terraform init, której zadaniem jest inicjalizacja katalogu roboczego, czyli przygotowanie środowiska do pracy:
terraform init

Następnie wprowadź komendę terraform plan, która służy do tworzenia planu wykonania (execution plan), który jest podglądem zmian, jakie zostaną wprowadzone w infrastrukturze:
terraform plan
Ostatnią komendą jest terraform apply, która służy do wdrażania zmian w infrastrukturze:
terraform apply
Wyświetli się sekcja Enter a value: wpisz „yes” i zatwierdź:


Po wykonaniu przejdź na stronę serwera Zabbix, odśwież ją, po chwili pokaże się nowy zsynchronizowany host (w moim przypadku o nazwie Wazuh) oraz zaciągnięty Template, Linux by Zabbix agent
Gotowe! Połączenie Terraform + Zabbix + Zabbix agent utworzone. Możesz już śmiało monitorować nowo stworzony host za pomocą Terraform!
Jest to pierwszy krok do automatyzacji łączenia hostów w Zabbix.
Podsumowanie
Artykuł opisuje integrację systemu monitoringu Zabbix z narzędziem Infrastructure as Code Terraform, umożliwiającą zarządzanie monitoringiem w sposób zautomatyzowany i deklaratywny.
Zabbix przedstawiono jako platformę do monitorowania serwerów, urządzeń sieciowych, aplikacji i środowisk wirtualnych, działającą w modelu serwer–agent z komunikacją przez API. System pozwala zbierać metryki (CPU, RAM, dysk), definiować triggery, generować alerty oraz budować dashboardy.
Terraform zaprezentowano jako narzędzie IaC umożliwiające zarządzanie infrastrukturą przy użyciu kodu (HCL) oraz komunikację z API różnych systemów. Standardowy workflow obejmuje komendy terraform init, terraform plan oraz terraform apply.
Integracja odbywa się poprzez provider REST (Mastercard/restapi), który pozwala wysyłać bezpośrednie żądania JSON-RPC do API Zabbixa. W pliku versions.tf definiowana jest wersja providera, w provider.tf konfigurowane jest połączenie z API (endpoint, nagłówki HTTP, token autoryzacyjny), natomiast w main.tf tworzone są zasoby przy użyciu restapi_object.
Opisano tworzenie grupy hostów metodą hostgroup.create oraz dodawanie hosta metodą host.create, wraz z konfiguracją interfejsu agenta, przypisaniem do grupy oraz podpięciem template’u. Podkreślono, że w przypadku bezpośrednich wywołań API wymagane są wartości typu integer zgodne z dokumentacją Zabbixa.
W części instalacyjnej przedstawiono konfigurację środowiska testowego obejmującego serwer Zabbix, serwer z Terraform oraz serwer Linux z zainstalowanym agentem Zabbix (w przykładzie host z Wazuh). Opisano instalację agenta, konfigurację pliku zabbix_agentd.conf, generowanie tokenu API w Zabbixie oraz przygotowanie plików Terraform.
Proces wdrożenia obejmuje inicjalizację projektu (terraform init), wygenerowanie planu zmian (terraform plan) oraz zastosowanie konfiguracji (terraform apply). Po wykonaniu operacji host zostaje automatycznie dodany do Zabbixa wraz z przypisanym template’em.
Podsumowując, rozwiązanie umożliwia zarządzanie monitoringiem jako kodem („Monitoring as Code”), automatyczne dodawanie hostów bez użycia GUI, pełną kontrolę nad API Zabbixa oraz dalszą automatyzację infrastruktury monitoringu.
Bezpłatne warsztaty: NMAP – Skanowanie Urządzeń i Portów w Sieci
Dowiedz się, jak wykrywać urządzenia w sieci, skanować porty i identyfikować usługi przy użyciu narzędzia NMAP. Poznasz podstawy skanowania, analizę wyników oraz praktyczne zastosowania w audycie bezpieczeństwa i testach penetracyjnych.
Środa, 18 marca o 14:00
