最近看docker相关文章,考虑到原有zabbix使用的是zabbix 4.5版本,想着就将zabbix 4.5升级到5.4。原有zabbix是采用rpm安装在linux服务器,本次采用docker进行快速升级。
1、安装docker环境
yum -y install docker-ce docker-ce-cli containerd.io
2、修改docker文件以便可以加速docker下载。
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://tsfugp9u.mirror.aliyuncs.com"]
}
重启服务生效
systemctl daemon-reload
systemctl restart docker
3、拉取zabbix相关镜像,由于mysql采用原来的mysql,本次就不拉取mysql的镜像。
docker pull zabbix/zabbix-server-mysql:alpine-5.4-latest
docker pull zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest
docker pull zabbix/zabbix-java-gateway:alpine-5.4-latest
运行一下命令可以看到镜像都已经拉取到本地。
[root@zabbix ~]# docker images -a
REPOSITORY TAG IMAGE ID CREATED SIZE
zabbix/zabbix-java-gateway alpine-5.4-latest 2552b7f42e42 2 weeks ago 84.4MB
zabbix/zabbix-web-nginx-mysql alpine-5.4-latest c75fcde05a14 4 weeks ago 166MB
zabbix/zabbix-server-mysql alpine-5.4-latest 856abc12b012 4 weeks ago 69MB
4、由于zabbix新版本支持时间高精度存储,需要对原有数据执行更新,脚本如下:
ALTER TABLE trends MODIFY value_min DOUBLE PRECISION DEFAULT '0.0000' NOT NULL, MODIFY value_avg DOUBLE PRECISION DEFAULT '0.0000' NOT NULL, MODIFY value_max DOUBLE PRECISION DEFAULT '0.0000' NOT NULL;
ALTER TABLE history MODIFY value DOUBLE PRECISION DEFAULT '0.0000' NOT NULL;
附上官方zabbix使用docker安装文档,包括不同数据库的方式,其中以下部分参考。
https://www.zabbix.com/documentation/current/manual/installation/containers
5、创建docker使用的网络
docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net
6、启动zabbix服务端
启动zabbix服务端,具体命令如下,其中DB服务器地址修改成了当前主机的IP地址。
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="172.17.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123456" \
-e MYSQL_ROOT_PASSWORD="22222" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--env=”ZBX_VMWARECACHESIZE=128M“ \
--env="ZBX_VALUECACHESIZE=2048M" \
--env="ZBX_CACHESIZE=4096M" \
--env="ZBX_HISTORYCACHESIZE=256M" \
-v /usr/lib/zabbix/alertscripts:/usr/lib/zabbix/alertscripts \
-v /usr/lib/zabbix/externalscripts:/usr/lib/zabbix/externalscripts \
--network=zabbix-net \
-p 10051:10051 \
--restart unless-stopped \
-d zabbix/zabbix-server-mysql:alpine-5.4-latest
刚开始启动过程中遇到内存分配的问题,通过多次查询资料在启动docker镜像的时候设置zabbix cachesize值,实际未从zabbix_server.conf继承文件,报错信息如下:
后将内存配置文件增加上去启动正常启动,具体zabbix相关的docker参数可以参考官方链接。
zabbix/zabbix-server-mysql - Docker Image | Docker Hub
启动过程中,可以看到zabbix数据库进行架构升级。
同时我们也会看到zabbxi有报错信息,具体为query failed,经过排查是因为zabbix用户无数据库权限,进行赋权进行修复。
grant all privileges on *.* to zabbix@'%';
flush privileges
7、启动zabbix 前端,数据库服务器地址修改为原有数据库地址
docker run --name zabbix-web-nginx-mysql -t \
-e ZBX_SERVER_HOST="zabbix-server-mysql" \
-e DB_SERVER_HOST="172.17.0.1" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="123456" \
-e MYSQL_ROOT_PASSWORD="2222@0!9" \
--network=zabbix-net \
-p 80:8080 \
--restart unless-stopped \
-d zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest
8、启动zabbix javagateway,实际其实未用到这块,根据实际情况启动。
docker run --name zabbix-java-gateway -t \
--network=zabbix-net \
--restart unless-stopped \
-d zabbix/zabbix-java-gateway:alpine-5.4-latest
9、以上启动完成可以通过docker ps -a 查看docker运行状态。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6243c6487f40 zabbix/zabbix-server-mysql:alpine-5.4-latest "/sbin/tini -- /usr/…" 2 days ago Up 12 hours 0.0.0.0:10051->10051/tcp zabbix-server-mysql
8df408791da4 zabbix/zabbix-web-nginx-mysql:alpine-5.4-latest "docker-entrypoint.sh" 2 days ago Up 2 days 8443/tcp, 0.0.0.0:80->8080/tcp zabbix-web-nginx-mysql
ac11c4ad1bfc zabbix/zabbix-java-gateway:alpine-5.4-latest "docker-entrypoint.s…" 2 days ago Up 2 days 10052/tcp zabbix-java-gateway
至此,完成zabbix的升级,可以通过原有连接打开zabbix界面。
10、其他解决问题
无法执行python脚本
由于原有告警通过python发送到钉钉群进行告警,升级有docker镜像无法执行python脚本,通过网上查询,改成shell脚本进行。
shell脚本内容如下:
#!/bin/bash
to=$1
subject=$2
text=$3
curl 'https://oapi.dingtalk.com/robot/send?access_token=d09356cabc8fde0cb5886ce3db765c799556f1d8e9aee56910640bda02e35e53' \
-H 'Content-Type: application/json' \
-d '
{"msgtype": "text",
"text": {
"content": "'"$text"'"
},
"at":{
"atMobiles": [ "'"$1"'" ],
"isAtAll": false
}
}'
修改完成后,修改zabbix中告警命令,我这里是用的send.sh,做完以上操作发现执行命令时提示无法执行curl命令,没办法得继续解决,需要在docker上安装curl命令。
登陆docker中执行curl安装。
docker exec -it 6243c6487f40 /bin/bash
执行以下命令,但是提示无权限。
bash-5.1$ apk add curl
ERROR: Unable to lock database: Permission denied
ERROR: Failed to open apk database: Permission denied
继续查找问题所在,由于docker权限过低无法执行以上命令,需要运行以下命令进行。
[root@zabbix ~]# docker exec -it --user=root 6243c6487f40 /bin/bash
bash-5.1# apk add curl
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/main/x86_64/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.13/community/x86_64/APKINDEX.tar.gz
(1/1) Installing curl (7.77.0-r1)
Executing busybox-1.32.1-r6.trigger
OK: 61 MiB in 50 packages
bash-5.1# curl
curl: try 'curl --help' or 'curl --manual' for more information
至此解决了curl安装,告警也可以正常发送。
但是以上只是临时解决了此问题,若将docker删除后重新启动新的docker依然无curl命令,可以考虑将docker镜像导出在导入的方式进行。
导出images
docker export 19a9ce28b4b3 > /tmp/zabbix.tar
导入images,以下都可以
cat /tmp/nginx.tar | docker import - zabbix/zabbix-server-curl
docker import - test/nginx_1 /tmp/nginx.tar
文章评论