Zabbix

with docker compose

Kang Min Kim
CodeAlpha
13 min readSep 14, 2023

--

엔터프라이즈급을 커버 할 수 있는 오픈소스 모니터링 툴을 고민하고 있다면 zabbix는 훌륭한 선택이 될 수 있다. zabbix 가 무엇인지에 대한 설명은 공식홈페이지의 메뉴얼을 읽어보면 되고 이 페이지 에선 실제 운영을 위한 설치법을 알아보겠다.

1. docker compose

우선 zabbix를 운영할 서버에 git을 설치 후 아래 저장소를 클론 한다.

취향에 맞게 컴포즈 파일을 선택하고 설치를 진행 하면 되는데 필자의 경우 docker-compose_v3_ubuntu_pgsql_latest.yaml 를 선택하였다. 파일이름이 너무 길기 때문에 아래 커맨드로 변경한다.

cp docker-compose_v3_ubuntu_pgsql_latest.yaml ./docker-compose.yaml

설치하려는 서버가 http 포트를 사용 중이기 때문에 포트를 변경해 주었다. zabbix-web-nginx-pgsql 컨테이너가 웹 서비스를 담당하므로 이 서비스 아래의 ports 속성을 변경한다.

zabbix-web-nginx-pgsql:
image: zabbix/zabbix-web-nginx-pgsql:ubuntu-6.4-latest
restart: always
ports:
- "port_number_you_want:8080"
- "443:8443"

docker compose up -d 커맨드로 서비스를 실행하면 active agent 를 받아들기이 위한 10051 포트가 활성화된 zabbix 서버와 nginx 를 통한 web 페이지가 서비스 된다.

[I-00] zabbix 로그인 화면
[I-01] docker ps -a

zabbix 서버를 서비스 하고 있는 호스트 자체를 모니터링 하려면 컴포즈 파일안의 agent 서비스를 실행 해주어야 한다.

 zabbix-agent:
image: zabbix/zabbix-agent:ubuntu-6.4-latest
profiles:
- full
- all
ports:
- "10050:10050"

profiles 속성이 추가 되어 있어 docker compose --profile full 과 같이 실행해야 agent 가 함께 실행 된다. 하지만 docker-compose.yaml 파일에서 profile 속성을 사용하고 있는 서비스가 많기 때문에 필요한 컨테이너만 선택적으로 실행 해야 한다.

🛑 .env_agent

agent를 실행하기 이전에 zabbix-agent 가 참고하는 .env_agent 파일을 수정한다. 프로젝트 파일에서 /env_vars/.env_agent 를 아래와 같이 수정한다.

# ZBX_SOURCEIP=
# ZBX_DEBUGLEVEL=3
# ZBX_ENABLEREMOTECOMMANDS=0 # Deprecated since 5.0.0
# ZBX_LOGREMOTECOMMANDS=0
# ZBX_FORCEACTIVECHECKSONSTART=0 # Available since 6.0.2
# ZBX_HEARTBEAT_FREQUENCY=60 # Available since 6.2
# ZBX_HOSTINTERFACE= # Available since 4.4.0
# ZBX_HOSTINTERFACEITEM= # Available since 4.4.0
ZBX_SERVER_HOST=zabbix_server_ip
ZBX_PASSIVE_ALLOW=true
# ZBX_PASSIVESERVERS=
ZBX_ACTIVE_ALLOW=false
# ZBX_ACTIVESERVERS=
# ZBX_LISTENIP=
# ZBX_LISTENBACKLOG=

ZBX_SERVER_HOST 는 zabbix 가 실행되고 있는 컨테이너와 연결된 docker 의 가상 네트워크 ip 를 입력해주어야 한다.

docker inspect zabbix-docker-zabbix-server-1
[I-02] zabbix host machine IPAdress

compose 파일을 잘 읽어보면 zbx_net_backend 라는 이름의 네트워크를 만들고 서브네팅하여 사용하고 있다는 걸 알 수 있다. 여기서 우리는 docker 프로세스 안에서 zabbix 를 구동 중인 서버의 IPAddress 을 가져와 .env_agent 파일의 ZBX_SERVER_HOST 에 입력 해 준다.

🔌 passive? active?

같은 네트워크에 위치하는 머신들의 경우 passive 모드로 server 가 데이터를 찍어 오지만 agent 가 server 와 다른 네트워크에 위치할 경우 active 모드로 데이터를 전송 해야 한다. 기본은 passive 모드 이지만 간혹 로그를 확인해보면 10051 로 접속을 시도하는 경우가 있는데 이를 방지하기 위해 active 모드를 명시적으로 비활성화 시킨다.

docker comopse up zabbix-agent -d

위 명령으로 docker-compose.yaml 파일에서 특정 컨테이너를 실행 시킨다 여기서는 zabbix-agent 라는 컨테이너만 실행 한다. agent 를 실행 한 뒤에는 zabbix 에서host 를 등록해야 한다. 이때 등록하는 호스트의 이름과 agent 가 동작 중인 host의 실제 이름을 동일하게 입력해줘야 한다.

[I-03] Hosts 등록 예시

Interfaces 의 Agnet 필드에는 agent 가 실행되고 있는 컨테이너의 ip를 입력해야 한다. 여기서 linux, windows, active 모드의 세가지 경우에 따라 등록한는 방법이 달라진다.

2. Agent service install other machine

운영 상황에 따라 다르겠지만 필자의 경우 크게 3가지 유형에 따라 agent 등록을 진행 하였다.

  • Linux docker compose agent (passive)
  • Windows agent (passive)
  • Windows agent (active)

2.1 Linux docker compose agent

agent 를 실행할 호스트가 linux 일 경우 동일하게 저장소를 클론하고 아래 zabbix-docker/env_vars/.env_agent 파일과 compose 파일의 zabbix-agent 컨테이너 부분을 수정한다.

# ZBX_SOURCEIP=
# ZBX_DEBUGLEVEL=3
# ZBX_ENABLEREMOTECOMMANDS=0 # Deprecated since 5.0.0
# ZBX_LOGREMOTECOMMANDS=0
# ZBX_FORCEACTIVECHECKSONSTART=0 # Available since 6.0.2
# ZBX_HEARTBEAT_FREQUENCY=60 # Available since 6.2
# ZBX_HOSTINTERFACE= # Available since 4.4.0
# ZBX_HOSTINTERFACEITEM= # Available since 4.4.0
ZBX_SERVER_HOST=zabbix_server_ip
ZBX_PASSIVE_ALLOW=true
# ZBX_PASSIVESERVERS=
ZBX_ACTIVE_ALLOW=false
# ZBX_ACTIVESERVERS=
# ZBX_LISTENIP=
# ZBX_LISTENBACKLOG=
# ZBX_STARTAGENTS=3
ZBX_HOSTNAME=agent_hostname
ZBX_HOSTNAMEITEM=agent_hostname
# ZBX_METADATA=
 zabbix-agent:
image: zabbix/zabbix-agent:ubuntu-6.4-latest
profiles:
- full
- all
ports:
- "10050:10050"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./zbx_env/etc/zabbix/zabbix_agentd.d:/etc/zabbix/zabbix_agentd.d:ro
- ./zbx_env/var/lib/zabbix/modules:/var/lib/zabbix/modules:ro
- ./zbx_env/var/lib/zabbix/enc:/var/lib/zabbix/enc:ro
- ./zbx_env/var/lib/zabbix/ssh_keys:/var/lib/zabbix/ssh_keys:ro
deploy:
resources:
limits:
cpus: '0.2'
memory: 128M
reservations:
cpus: '0.1'
memory: 64M
mode: global
env_file:
- ./env_vars/.env_agent
privileged: true
pid: "host"
network_mode: "host"
stop_grace_period: 5s
labels:
com.zabbix.description: "Zabbix agent"
com.zabbix.company: "Zabbix LLC"
com.zabbix.component: "zabbix-agentd"
com.zabbix.os: "ubuntu"

network: "host" 로 변경하여 호스트의 네트워크 정보를 그대로 사용하도록 한다. compose 파일에 사전 구성된 network 을 사용할 경우 같은 네트워크에 속하지 않기 때문에 host 등록 후 데이터를 제대로 가져오지 못한다.

[I-04] Linux passive agnet register by docker compose

2.2 Windows agent

아래 경로에서 agent 2 버전으로 다운 받는다.

$agent_installer=Join-Path $PSScriptRoot "zabbix_agent2-6.4.6-windows-amd64-openssl.msi"
$env:SEE_MASK_NOZONECHECKS = 1

function log {
param(
[string]$text
)
write-host -ForegroundColor Green `
"$env:computername : $text"
}

function install
{
log "Zabbix Agent install start"
$MSIArguments = @(
"/l*v", "log.txt",
"/i", $agent_installer,
"/qn",
"LOGTYPE=file",
"HOSTNAME=$env:computername"
"SERVER=your_server_ip",
"LISTENPORT=10050",
"ENABLEPATH=1"
)
if(![System.IO.File]::Exists($agent_installer)) {
Start-Process -FilePath "msiexec.exe" -ArgumentList $MSIArguments -Wait
}
log "Zabbix Agent install end"
}

install
Remove-Item env:SEE_MASK_NOZONECHECKS

설치 편의를 위해 ps1 스크립트를 작성하였다. 이 파워 쉘을 agent 설치 파일이 있는 곳에서 실행 시킨다.

zabbix 웹에서 호스트 등록 방법은 [I-04] 와 동일하며 agent의 호스트 이름, ip address 을 입력하고 template 은 Windows by Zabbix agent 를 선택한다.

2.3 Windows agent (active)

앞서 설명 한 것처럼 active 모드는 클라이언트가 자신의 정보를 서버로 전송하는 방식이다. 필자의 경우 서버와 클라이언트가 같은 네트워크 상에 위치 하지만 서버가 클라이언트에 도달할 수 없는 상태였고 반대로 클라이언트는 서버에 접속 가능한 상태 이다. 이때 active 방식으로 연결해 클라이언트 정보를 zabbix server 로 보낼 수 있다.

윈도우 클라이언트를 active 로 등록하는 방법은 간단하다.
%ProgramFiles%\Zabbix Agent 2\zabbix_agent2.conf 파일의 ServerActive에 서버 ip를 입력하면 된다.

ServerActive=zabbix_server_ip

### Option: Hostname
# List of comma delimited unique, case sensitive hostnames.
# Required for active checks and must match hostnames as configured on the server.
# Value is acquired from HostnameItem if undefined.
#
# Mandatory: no
# Default:
# Hostname=

Hostname=your_agent_host_name
[I-05] Windows active agent register

zabbix_agent2.conf 파일에 입력한 Hostname 과 zabbix web 에서 host 등록 시 입력하는 Host name 은 반드시 일치 해야 한다.

[I-06] Hosts page

주의할 점은 active 모드로 등록 된 agent 의 경우 Availability 에서 ZBX 에 초록불이 들어오지 않는다. 마우스 오버 해보면 Acitve checks 가 활성화 된 것을 확인 할 수 있다.

이상 zabbix 서버와 agent 을 등록하는 방법을 알아보았다. 다음 포스트에서는 zabbix web 을 활용하는 방법을 알아본다.

--

--