From 42038a00715518b65293a1a5b56f2a489a10151c Mon Sep 17 00:00:00 2001 From: Alexander Zobnin Date: Thu, 28 Apr 2022 16:41:08 +0300 Subject: [PATCH] Add docker test environment for Zabbix 6.0 --- devenv/README.md | 1 + devenv/zabbix60/bootstrap/Dockerfile | 17 + devenv/zabbix60/bootstrap/bootstrap_config.py | 80 ++++ .../zabbix60/bootstrap/zbx_export_hosts.xml | 432 ++++++++++++++++++ devenv/zabbix60/docker-compose.yml | 107 +++++ devenv/zas-agent/.dockerignore | 6 + devenv/zas-agent/Dockerfile | 36 ++ .../zas-agent/conf/zas_scenario_backend.cfg | 54 +++ .../zas-agent/conf/zas_scenario_database.cfg | 54 +++ .../zas-agent/conf/zas_scenario_default.cfg | 44 ++ .../zas-agent/conf/zas_scenario_frontend.cfg | 54 +++ devenv/zas-agent/run_zas_agent.sh | 12 + devenv/zas-agent/zas_scenario.cfg | 60 +++ 13 files changed, 957 insertions(+) create mode 100644 devenv/README.md create mode 100644 devenv/zabbix60/bootstrap/Dockerfile create mode 100644 devenv/zabbix60/bootstrap/bootstrap_config.py create mode 100644 devenv/zabbix60/bootstrap/zbx_export_hosts.xml create mode 100644 devenv/zabbix60/docker-compose.yml create mode 100644 devenv/zas-agent/.dockerignore create mode 100644 devenv/zas-agent/Dockerfile create mode 100644 devenv/zas-agent/conf/zas_scenario_backend.cfg create mode 100644 devenv/zas-agent/conf/zas_scenario_database.cfg create mode 100644 devenv/zas-agent/conf/zas_scenario_default.cfg create mode 100644 devenv/zas-agent/conf/zas_scenario_frontend.cfg create mode 100755 devenv/zas-agent/run_zas_agent.sh create mode 100644 devenv/zas-agent/zas_scenario.cfg diff --git a/devenv/README.md b/devenv/README.md new file mode 100644 index 0000000..250896b --- /dev/null +++ b/devenv/README.md @@ -0,0 +1 @@ +# Development environment for the plugin diff --git a/devenv/zabbix60/bootstrap/Dockerfile b/devenv/zabbix60/bootstrap/Dockerfile new file mode 100644 index 0000000..da6457f --- /dev/null +++ b/devenv/zabbix60/bootstrap/Dockerfile @@ -0,0 +1,17 @@ +FROM python:2.7 + +ENV ZBX_API_URL=http://zabbix-web:8080 +ENV ZBX_API_USER="Admin" +ENV ZBX_API_PASSWORD="zabbix" +ENV ZBX_CONFIG="zbx_export_hosts.xml" +ENV ZBX_BOOTSTRAP_SCRIPT="bootstrap_config.py" + +RUN pip install pyzabbix + +ADD ./bootstrap_config.py /bootstrap_config.py +ADD ${ZBX_CONFIG} /${ZBX_CONFIG} + +WORKDIR / + +# Run bootstrap_config.py when the container launches +CMD ["python", "/bootstrap_config.py"] diff --git a/devenv/zabbix60/bootstrap/bootstrap_config.py b/devenv/zabbix60/bootstrap/bootstrap_config.py new file mode 100644 index 0000000..9f4a15b --- /dev/null +++ b/devenv/zabbix60/bootstrap/bootstrap_config.py @@ -0,0 +1,80 @@ +import os +from time import sleep +from pyzabbix import ZabbixAPI, ZabbixAPIException + +zabbix_url = os.environ['ZBX_API_URL'] +zabbix_user = os.environ['ZBX_API_USER'] +zabbix_password = os.environ['ZBX_API_PASSWORD'] +print(zabbix_url, zabbix_user, zabbix_password) + +zapi = ZabbixAPI(zabbix_url, timeout=5) + +for i in range(10): + print("Trying to connected to Zabbix API %s" % zabbix_url) + try: + zapi.login(zabbix_user, zabbix_password) + print("Connected to Zabbix API Version %s" % zapi.api_version()) + break + except ZabbixAPIException as e: + print e + sleep(5) + except: + print("Waiting") + sleep(5) + + +config_path = os.environ['ZBX_CONFIG'] +import_rules = { + 'discoveryRules': { + 'createMissing': True, + 'updateExisting': True + }, + 'graphs': { + 'createMissing': True, + 'updateExisting': True + }, + 'groups': { + 'createMissing': True + }, + 'hosts': { + 'createMissing': True, + 'updateExisting': True + }, + 'images': { + 'createMissing': True, + 'updateExisting': True + }, + 'items': { + 'createMissing': True, + 'updateExisting': True + }, + 'maps': { + 'createMissing': True, + 'updateExisting': True + }, + 'templateLinkage': { + 'createMissing': True, + }, + 'templates': { + 'createMissing': True, + 'updateExisting': True + }, + 'triggers': { + 'createMissing': True, + 'updateExisting': True + }, +} + +print("Importing Zabbix config from %s" % config_path) +with open(config_path, 'r') as f: + config = f.read() + + try: + # https://github.com/lukecyca/pyzabbix/issues/62 + import_result = zapi.confimport("xml", config, import_rules) + print(import_result) + except ZabbixAPIException as e: + print e + +for h in zapi.host.get(output="extend"): + print(h['name']) diff --git a/devenv/zabbix60/bootstrap/zbx_export_hosts.xml b/devenv/zabbix60/bootstrap/zbx_export_hosts.xml new file mode 100644 index 0000000..068b9d8 --- /dev/null +++ b/devenv/zabbix60/bootstrap/zbx_export_hosts.xml @@ -0,0 +1,432 @@ + + + 6.0 + 2022-04-28T13:04:18Z + + + 2e427c268ac1468b9add94b65e2d6c14 + Backend + + + d97ba66b283544339628b71975a6e68d + Frontend + + + dc579cd7a1a34222933f24f52a68bcd8 + Linux servers + + + 6f6799aa69e844b4b3918f779f2abf08 + Zabbix servers + + + 7df96b18c230490a9a0a9e2307226338 + Templates + + + + + backend01 + backend01 + + + + + + Backend + + + Linux servers + + + + + NO + zas_backend_01 + if1 + + + + + backend + + + service + backend + + + DISABLED + + + backend02 + backend02 + + + + + + Backend + + + Linux servers + + + + + NO + zas_backend_02 + if1 + + + + + backend + + + service + backend + + + DISABLED + + + frontend01 + frontend01 + + + + + + Frontend + + + Linux servers + + + + + NO + zas_frontend_01 + if1 + + + + + frontend + + + service + frontend + + + DISABLED + + + frontend02 + frontend02 + + + + + + Frontend + + + Linux servers + + + + + NO + zas_frontend_02 + if1 + + + + + frontend + + + service + frontend + + + DISABLED + + + Zabbix server + Zabbix server + + + + + + + Zabbix servers + + + + + NO + zabbix-agent + if1 + + + DISABLED + + + + + + + + 7aac0ec0c0e04b7a8bb6472d1faa7a09 + CPU load + FIXED + + + 009900 + + Template ZAS Agent + system.cpu.load[percpu,avg1] + + + + 2 + 990000 + + Template ZAS Agent + system.cpu.load[percpu,avg15] + + + + + + f25064d88b964a678fac7ea6095b238a + CPU utilization + NO + STACKED + FIXED + FIXED + + + 4 + FILLED_REGION + 999900 + + Template ZAS Agent + system.cpu.util[,iowait] + + + + 5 + FILLED_REGION + 990000 + + Template ZAS Agent + system.cpu.util[,system] + + + + 6 + FILLED_REGION + 000099 + + Template ZAS Agent + system.cpu.util[,user] + + + + + + diff --git a/devenv/zabbix60/docker-compose.yml b/devenv/zabbix60/docker-compose.yml new file mode 100644 index 0000000..8886f83 --- /dev/null +++ b/devenv/zabbix60/docker-compose.yml @@ -0,0 +1,107 @@ +version: "3" + +services: + # Zabbix + zabbix-server: + image: zabbix/zabbix-server-pgsql:alpine-6.0-latest + ports: + - "10051:10051" + depends_on: + - database + environment: + DB_SERVER_HOST: database + DB_SERVER_PORT: 5432 + POSTGRES_USER: zabbix + POSTGRES_PASSWORD: zabbix + POSTGRES_DB: zabbix + ZBX_TIMEOUT: 10 + ZBX_STARTPOLLERS: 10 + ZBX_STARTPOLLERSUNREACHABLE: 5 + ZBX_DEBUGLEVEL: 3 + + zabbix-web: + image: zabbix/zabbix-web-apache-pgsql:alpine-6.0-latest + ports: + - "8188:8080" + depends_on: + - database + - zabbix-server + environment: + ZBX_SERVER_HOST: zabbix-server + ZBX_SERVER_PORT: 10051 + DB_SERVER_HOST: database + DB_SERVER_PORT: 5432 + POSTGRES_USER: zabbix + POSTGRES_PASSWORD: zabbix + POSTGRES_DB: zabbix + + database: + image: postgres + ports: + - "15432:5432" + command: postgres -c 'max_connections=1000' + environment: + POSTGRES_USER: zabbix + POSTGRES_PASSWORD: zabbix + + zabbix-agent: + image: zabbix/zabbix-agent:alpine-6.0-latest + environment: + ZBX_SERVER_HOST: zabbix-server + ZBX_SERVER_PORT: 10051 + + ######################################################### + # Bootstrap config + ######################################################### + + bootstrap: + build: ./bootstrap + environment: + ZBX_API_URL: http://zabbix-web:8080 + ZBX_API_USER: Admin + ZBX_API_PASSWORD: zabbix + depends_on: + - database + - zabbix-server + - zabbix-web + + ######################################################### + # Fake agents + ######################################################### + + # backend + redis_backend: + image: redis:alpine + + zas_backend_01: + build: ../zas-agent + volumes: + - ../zas-agent/conf/zas_scenario_backend.cfg:/etc/zas_scenario.cfg + environment: + REDIS_HOST: redis_backend + # restart: always + + zas_backend_02: + build: ../zas-agent + volumes: + - ../zas-agent/conf/zas_scenario_backend.cfg:/etc/zas_scenario.cfg + environment: + REDIS_HOST: redis_backend + + # frontend + redis_frontend: + image: redis:alpine + + zas_frontend_01: + build: ../zas-agent + volumes: + - ../zas-agent/conf/zas_scenario_frontend.cfg:/etc/zas_scenario.cfg + environment: + REDIS_HOST: redis_frontend + + zas_frontend_02: + build: ../zas-agent + volumes: + - ../zas-agent/conf/zas_scenario_frontend.cfg:/etc/zas_scenario.cfg + environment: + REDIS_HOST: redis_frontend diff --git a/devenv/zas-agent/.dockerignore b/devenv/zas-agent/.dockerignore new file mode 100644 index 0000000..1887db6 --- /dev/null +++ b/devenv/zas-agent/.dockerignore @@ -0,0 +1,6 @@ +# *.md +# *.pdf +Dockerfile +Dockerfile* +run_zas.sh +*/.git diff --git a/devenv/zas-agent/Dockerfile b/devenv/zas-agent/Dockerfile new file mode 100644 index 0000000..ab5d676 --- /dev/null +++ b/devenv/zas-agent/Dockerfile @@ -0,0 +1,36 @@ +FROM python:2.7 + +ENV ZAS_SOURCE_URL=https://github.com/vulogov/zas_agent/archive/master.zip +ENV ZAS_ARC_NAME=zas_agent-master +# ENV ZAS_SOURCE_URL=https://github.com/alexanderzobnin/zas_agent/archive/numpy-dependency.zip +# ENV ZAS_ARC_NAME=zas_agent-numpy-dependency +ENV ZAS_ARC_FILE=${ZAS_ARC_NAME}.zip +ENV ZAS_WORKDIR="/zas-agent" + +RUN apt-get update && apt-get install -y ca-certificates +RUN apt-get install -y unzip wget + +# Download and extract +WORKDIR ${ZAS_WORKDIR} +RUN wget ${ZAS_SOURCE_URL} -O ${ZAS_ARC_FILE} +RUN unzip ${ZAS_ARC_FILE} + +# Install zas_agent +WORKDIR ${ZAS_WORKDIR}/${ZAS_ARC_NAME}/install +RUN python ./check_python_packages.py +WORKDIR ${ZAS_WORKDIR}/${ZAS_ARC_NAME} +RUN python setup.py build +RUN python setup.py install + +COPY ./run_zas_agent.sh ${ZAS_WORKDIR}/${ZAS_ARC_NAME}/run_zas_agent.sh + +# Make port 10050 available to the world outside this container +EXPOSE 10050 + +# Set default redis port to connect +ENV REDIS_PORT=6379 +ENV REDIS_HOST=redis + +# Run zas_agent.py when the container launches +# ENTRYPOINT ["./run_zas_agent.sh"] +CMD ["./run_zas_agent.sh"] diff --git a/devenv/zas-agent/conf/zas_scenario_backend.cfg b/devenv/zas-agent/conf/zas_scenario_backend.cfg new file mode 100644 index 0000000..53fc16a --- /dev/null +++ b/devenv/zas-agent/conf/zas_scenario_backend.cfg @@ -0,0 +1,54 @@ +## +## This target will match agent.ping requests +## and return static value 1 +[agent.ping] +value=static:1 + +[agent.version] +value=static:"zas-agent-master" + +[agent.hostname] +value=cmd:uname,-n + +## +## CPU time +## +[system.cpu.util system] +match=system.cpu.util\[,system\] +value=scenario: +scenario={"min":5,"max":30,"type":"float","variation_min":10,"variation_max":10, "spike_barrier":3,"spike_width":6} + +[system.cpu.util user] +match=system.cpu.util\[,user\] +value=scenario: +scenario={"min":10,"max":40,"type":"float","variation_min":20,"variation_max":20, "spike_barrier":3,"spike_width":18} + +[system.cpu.util iowait] +match=system.cpu.util\[,iowait\] +value=scenario: +scenario={"min":1,"max":30,"type":"float","variation_min":5,"variation_max":5, "spike_barrier":2,"spike_width":18} + +## +## System load (1 min average) +## +[system.cpu.load avg1] +match=system.cpu.load\[percpu,avg1\] +value=scenario: +scenario={"min":0,"max":5,"type":"float","variation_min":20,"variation_max":20,"spike_barrier":5,"spike_width":6} + +[system.cpu.load avg15] +match=system.cpu.load\[percpu,avg15\] +value=scenario: +scenario={"min":0.1,"max":3,"type":"float","variation_min":10,"variation_max":20, "spike_barrier":3,"spike_width":6} + +## +## Network interfaces +## +[all net.if.in] +match=net.if.in* +value=scenario: +scenario={"min":10000000,"max":20000000,"type":"int","variation_rnd":1,"spike_barrier":3,"spike_width":6} +[all net.if.out] +match=net.if.out* +value=scenario: +scenario={"min":30000000,"max":50000000,"type":"int","variation_min":5,"variation_max":5,"spike_barrier":3,"spike_width":18} diff --git a/devenv/zas-agent/conf/zas_scenario_database.cfg b/devenv/zas-agent/conf/zas_scenario_database.cfg new file mode 100644 index 0000000..fcce0d3 --- /dev/null +++ b/devenv/zas-agent/conf/zas_scenario_database.cfg @@ -0,0 +1,54 @@ +## +## This target will match agent.ping requests +## and return static value 1 +[agent.ping] +value=static:1 + +[agent.version] +value=static:"zas-agent-master" + +[agent.hostname] +value=cmd:uname,-n + +## +## CPU time +## +[system.cpu.util system] +match=system.cpu.util\[,system\] +value=scenario: +scenario={"min":20,"max":30,"type":"float","variation_min":5,"variation_max":5, "spike_barrier":2,"spike_width":3} + +[system.cpu.util user] +match=system.cpu.util\[,user\] +value=scenario: +scenario={"min":30,"max":50,"type":"float","variation_min":10,"variation_max":10, "spike_barrier":3,"spike_width":24} + +[system.cpu.util iowait] +match=system.cpu.util\[,iowait\] +value=scenario: +scenario={"min":1,"max":20,"type":"float","variation_min":5,"variation_max":5, "spike_barrier":2,"spike_width":12} + +## +## System load (1 min average) +## +[system.cpu.load avg1] +match=system.cpu.load\[percpu,avg1\] +value=scenario: +scenario={"min":1,"max":5,"type":"float","variation_min":20,"variation_max":20,"spike_barrier":5,"spike_width":6} + +[system.cpu.load avg15] +match=system.cpu.load\[percpu,avg15\] +value=scenario: +scenario={"min":0.5,"max":3,"type":"float","variation_min":10,"variation_max":20, "spike_barrier":3,"spike_width":30} + +## +## Network interfaces +## +[all net.if.in] +match=net.if.in* +value=scenario: +scenario={"min":60000000,"max":90000000,"type":"int","variation_rnd":1,"spike_barrier":2,"spike_width":3} +[all net.if.out] +match=net.if.out* +value=scenario: +scenario={"min":60000000,"max":90000000,"type":"int","variation_min":20,"variation_max":20,"spike_barrier":5,"spike_width":6} diff --git a/devenv/zas-agent/conf/zas_scenario_default.cfg b/devenv/zas-agent/conf/zas_scenario_default.cfg new file mode 100644 index 0000000..b279762 --- /dev/null +++ b/devenv/zas-agent/conf/zas_scenario_default.cfg @@ -0,0 +1,44 @@ +## +## This target will match all vfs.fs.size[*,pfree] requests +## and generate uniform random numbers in range 1 to 100 +## +[filesystems.size pfree] +match=vfs.fs.size\[(.?),pfree\] +value=uniform:1,100 +[application.connections] +value=uniform_int:1,100 + +## +## This target will match all vfs.fs.size[*,free] requests +## and request data from REDIS +## +[filesystem.size free] +match=vfs.fs.size\[(.?),free\] +value=redis: +[all net.if.in] +match=net.if.in* +value=redis: +[all net.if.out] +match=net.if.out* +value=redis: +## +## Scenario calculations +## +[all system.cpu.util] +match=system.cpu.util* +value=scenario: +scenario={"min":0,"max":20,"type":"float","variation_min":10,"variation_max":10} + +## +## This target will match all vfs.fs.size[*,used] requests +## and request data from REDIS lists +## +[filesystem.size used] +match=vfs.fs.size\[(.?),used\] +value=rqueue: + +## +## This target will match agent.ping requests +## and return static value 1 +[agent.ping] +value=static:1 diff --git a/devenv/zas-agent/conf/zas_scenario_frontend.cfg b/devenv/zas-agent/conf/zas_scenario_frontend.cfg new file mode 100644 index 0000000..c61b01c --- /dev/null +++ b/devenv/zas-agent/conf/zas_scenario_frontend.cfg @@ -0,0 +1,54 @@ +## +## This target will match agent.ping requests +## and return static value 1 +[agent.ping] +value=static:1 + +[agent.version] +value=static:"zas-agent-master" + +[agent.hostname] +value=cmd:uname,-n + +## +## CPU time +## +[system.cpu.util system] +match=system.cpu.util\[,system\] +value=scenario: +scenario={"min":15,"max":20,"type":"float","variation_min":5,"variation_max":5, "spike_barrier":2,"spike_width":3} + +[system.cpu.util user] +match=system.cpu.util\[,user\] +value=scenario: +scenario={"min":30,"max":50,"type":"float","variation_min":10,"variation_max":10, "spike_barrier":3,"spike_width":24} + +[system.cpu.util iowait] +match=system.cpu.util\[,iowait\] +value=scenario: +scenario={"min":1,"max":30,"type":"float","variation_min":5,"variation_max":5, "spike_barrier":2,"spike_width":12} + +## +## System load (1 min average) +## +[system.cpu.load avg1] +match=system.cpu.load\[percpu,avg1\] +value=scenario: +scenario={"min":0,"max":5,"type":"float","variation_min":10,"variation_max":30,"spike_barrier":5,"spike_width":30} + +[system.cpu.load avg15] +match=system.cpu.load\[percpu,avg15\] +value=scenario: +scenario={"min":0.1,"max":3,"type":"float","variation_min":5,"variation_max":10, "spike_barrier":3,"spike_width":30} + +## +## Network interfaces +## +[all net.if.in] +match=net.if.in* +value=scenario: +scenario={"min":5000000,"max":10000000,"type":"int","variation_rnd":1,"spike_barrier":3,"spike_width":20} +[all net.if.out] +match=net.if.out* +value=scenario: +scenario={"min":60000000,"max":90000000,"type":"int","variation_min":20,"variation_max":20,"spike_barrier":5,"spike_width":20} diff --git a/devenv/zas-agent/run_zas_agent.sh b/devenv/zas-agent/run_zas_agent.sh new file mode 100755 index 0000000..3256f66 --- /dev/null +++ b/devenv/zas-agent/run_zas_agent.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Run redis server first +# cd /zas/redis-3.2.9/src/ +# nohup redis-server > /tmp/redis.log & + +REDIS_HOST=${REDIS_HOST:-"redis"} +REDIS_PORT=${REDIS_PORT:-"6381"} + +rm -f /tmp/zas_agent.pid +echo Using redis host: ${REDIS_HOST} and port: ${REDIS_PORT} +zas_agent.py --start --user root --group root --scenario /etc/zas_scenario.cfg --redis_host ${REDIS_HOST} --redis_port ${REDIS_PORT} diff --git a/devenv/zas-agent/zas_scenario.cfg b/devenv/zas-agent/zas_scenario.cfg new file mode 100644 index 0000000..60a9339 --- /dev/null +++ b/devenv/zas-agent/zas_scenario.cfg @@ -0,0 +1,60 @@ +## +## This target will match all vfs.fs.size[*,pfree] requests +## and generate uniform random numbers in range 1 to 100 +## +[filesystems.size pfree] +match=vfs.fs.size\[(.?),pfree\] +value=uniform:1,100 +[application.connections] +value=uniform_int:1,100 + +## +## This target will match all vfs.fs.size[*,free] requests +## and request data from REDIS +## +[filesystem.size free] +match=vfs.fs.size\[(.?),free\] +value=redis: +[all net.if.in] +match=net.if.in* +value=scenario: +scenario={"min":0,"max":100000,"type":"int","variation_rnd":1,"spike_barrier":3,"spike_width":6} +[all net.if.out] +match=net.if.out* +value=scenario: +scenario={"min":0,"max":100000,"type":"int","variation_min":5,"variation_max":5,"spike_barrier":10,"spike_width":6} +## +## Scenario calculations +## +[all system.cpu.util] +match=system.cpu.util* +value=scenario: +scenario={"min":0,"max":20,"type":"float","variation_min":10,"variation_max":10} + +[all system.cpu.load] +match=system.cpu.load* +value=scenario: +scenario={"min":0,"max":5,"type":"float","variation_min":20,"variation_max":20} + +## +## This target will match all vfs.fs.size[*,used] requests +## and request data from REDIS lists +## +[filesystem.size used] +match=vfs.fs.size\[(.?),used\] +value=rqueue: + +## +## This target will match agent.ping requests +## and return static value 1 +[agent.ping] +value=static:1 + +[agent.version] +value=static:zas-0.1.1 + +[agent.hostname] +value=cmd:uname,-n + +[system.uname] +value=cmd:uname,-a