Integracja Terraform + Zabbix + Zabbix agent

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

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

Sprawdź szczegóły: https://asdevops.pl/warsztaty/

 

 


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:

  1. Terraform łączy się z API Zabbix.
  2. Tworzy zasoby typu:
    • host
    • grupa
    • template
    • trigger
    • akcja
  3. 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/restapi z 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/json
  • Authorization = 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?

  1. Terraform wysyła żądanie hostgroup.create
  2. Tworzy grupę Web Servers
  3. Wysyła żądanie host.create
  4. Tworzy hosta Wazuh
  5. 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

Sprawdź szczegóły: https://asdevops.pl/warsztaty/

 

 

 

 

Darmowe warsztaty NMAP - Skanowanie Urządzeń i Portów W Sieci

X