优雅地部署Zabbix – Part 1

前言

进入新公司接手了监控项目,由于历史遗留问题(笑)内部有大量的坑,无奈推倒重来,后面会针对整个项目再做一个总结,这里不再赘述。

Zabbix作为老牌企业级开源监控,虽然有诸如监控图表鸡肋、配置麻烦等缺点,但同时也有监控协议灵活,部署轻量级等足以让你忽略掉各种缺点的优点。毫无疑问,是绝大多数公司的最佳选项。

Zabbix后端是C写的,前端是用The Best Language in The World 写的。由Zabbix Company负责维护,同大多数大型开源软件差不多,提供了各种各样的安装方式,Source/Package/repo应有尽有。

可能是由于早期国内第一批接触Zabbix的人都有源代码编译癖,几乎所有的教程全部都是教你通过编译源代码进行安装和部署,加之官方只会放出世代release版本的rpm/deb包。所以大家也都欣然接受通过编译安装Server端。

分析过程

前面提到,公司的监控项目需要打破重建,我司是几个人的小公司吗?由于涉及到数以千计的物理机和同等数量级的AP/AC/Router,所以我理所应当地采用了Server-Proxy-Agent的模式构建整个监控平台。

图一:架构简略图

接着,本着面向GitHub/StackOverflow编程的原则,遍历项目无果。遂调整思路自己打包。由于初次涉及相关业务,新手上路踩坑无数。起初,思路清晰,在官方repo里面拿到最新源码,寻找官网文档进行rebuild。发现官方发布的源码阉割掉了打包rules,rebulid文档也是基于2.x版本写的。通过apt source下来的源码也是2.x版本的,通过官网文档添加source.list莫名失败。总之怎么弄怎么不行。

后来左思右想,社区应该不会这么脑残没有解决这问题。

最后发现了端倪,实际上,他们封装了source.list到deb包,直接安装即可获取最新源码。

wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+xenial_all.deb
dpkg -i zabbix-release_3.2-1+xenial_all.deb

接着就引刃而解。

apt update

mkdir ~/temp && cd ~/temp

apt source zabbix

这个时候,debian文件夹就出现了

图二:文件目录

 

打包的规则

接着,就开始编译打包吗?那你就错了。为什么要这么折腾,不仅仅是为了最后的安装包,关键在这:debian/rules,也是整个编译过程中的控制脚本,以下是zabbix3.2.6的rules,下篇博文会就打包规则及debian helper(dh)的使用进行阐述。

#!/usr/bin/make -f
PACKAGES        = PGSQL MYSQL SQLITE3
MYSQL_NAME      = mysql
PGSQL_NAME      = postgresql
SQLITE3_NAME    = sqlite3
COMMON_CONFIG = --host=$(DEB_HOST_GNU_TYPE) \
--build=$(DEB_BUILD_GNU_TYPE) \
--prefix=/usr \
--sysconfdir=/etc/zabbix \
--libdir=/usr/lib/zabbix \
--enable-server \
--enable-agent \
--enable-ipv6 \
--enable-proxy \
--enable-java \
--with-jabber \
--with-ldap \
--with-net-snmp \
--with-openipmi \
--with-ssh2 \
--with-libcurl \
--with-unixodbc \
--with-libxml2 \
--with-openssl
%:
dh [email protected]  --with autotools-dev
override_dh_clean:
dh_clean
rm -f debian/conf/zabbix_agentd.conf
rm -f debian/conf/zabbix_server.conf
rm -f debian/conf/zabbix_proxy.conf
rm -f debian/conf/zabbix_java_gateway.conf
rm -f debian/conf/zabbix_java_gateway_logback.xml
rm -f database/*/create.sql
override_dh_auto_configure:
$(foreach pkg, $(PACKAGES), \
mkdir -p $(CURDIR)/debian/tmp.build-$(pkg) ; \
tar -cSf - --exclude=./bin --exclude=./build --exclude=./frontends --          exclude=./debian . \
| tar -xSpf - -C $(CURDIR)/debian/tmp.build-$(pkg) ; \
cat $(CURDIR)/database/$($(pkg)_NAME)/schema.sql > $(CURDIR)/database/         $($(pkg)_NAME)/create.sql ; \
cat $(CURDIR)/database/$($(pkg)_NAME)/images.sql >> $(CURDIR)/database/        $($(pkg)_NAME)/create.sql ; \
cat $(CURDIR)/database/$($(pkg)_NAME)/data.sql >> $(CURDIR)/database/          $($(pkg)_NAME)/create.sql ; \
dh_auto_configure --sourcedirectory=$(CURDIR)/debian/tmp.build-$(pkg) --       $(COMMON_CONFIG) --with-$($(pkg)_NAME) ; \
)
override_dh_auto_build:
$(foreach pkg, $(PACKAGES), \
dh_auto_build --sourcedirectory=$(CURDIR)/debian/tmp.build-$(pkg) ; \
)
)
cat conf/zabbix_agentd.conf | sed \
-e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_agentd.pid' \
-e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_agentd.log|g' \
-e '/^# LogFileSize=.*/a \\nLogFileSize=0' \
-e '/^# Include=$$/a \\nInclude=/etc/zabbix/zabbix_agentd.d/*.conf' \
> debian/conf/zabbix_agentd.conf
cat conf/zabbix_server.conf |sed \
-e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_server.pid' \
-e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_server.log|g' \
-e '/^# LogFileSize=/a \\nLogFileSize=0' \
-e '/^# AlertScriptsPath=/a \\nAlertScriptsPath=/usr/lib/zabbix/alertscripts'  \
-e '/^# ExternalScripts=/a \\nExternalScripts=/usr/lib/zabbix/                 externalscripts' \
-e '/^# FpingLocation=/a \\nFpingLocation=/usr/bin/fping' \
-e '/^# Fping6Location=/a \\nFping6Location=/usr/bin/fping6' \
> debian/conf/zabbix_server.conf
cat conf/zabbix_proxy.conf | sed \
-e '/^# PidFile=/a \\nPidFile=/var/run/zabbix/zabbix_proxy.pid' \
-e 's|^LogFile=.*|LogFile=/var/log/zabbix/zabbix_proxy.log|g' \
-e '/^# LogFileSize=/a \\nLogFileSize=0' \
-e '/^# ExternalScripts=/a \\nExternalScripts=/usr/lib/zabbix/                 externalscripts' \
-e '/^# FpingLocation=/a \\nFpingLocation=/usr/bin/fping' \
-e '/^# Fping6Location=/a \\nFping6Location=/usr/bin/fping6' \
> debian/conf/zabbix_proxy.conf
cat src/zabbix_java/settings.sh | sed \
-e 's|^PID_FILE=.*|PID_FILE="/var/run/zabbix/zabbix_java_gateway.pid"|g' \
-e '/^# TIMEOUT=/a \\nTIMEOUT=3' \
> debian/conf/zabbix_java_gateway.conf
cat src/zabbix_java/lib/logback.xml | sed \
-e 's|/tmp/zabbix_java.log|/var/log/zabbix/zabbix_java_gateway.log|g' \
> debian/conf/zabbix_java_gateway_logback.xml
override_dh_install:
dh_install
rm debian/zabbix-java-gateway/usr/share/zabbix-java-gateway/lib/logback.xml
rm debian/zabbix-java-gateway/usr/share/zabbix-java-gateway/lib/logback-console.   xml
chmod 755 debian/zabbix-java-gateway/usr/sbin/zabbix_java_gateway
find debian/zabbix-frontend-php/usr/share/zabbix -name .htaccess | xargs rm -f
find debian/zabbix-frontend-php/usr/share/zabbix/locale -name '*.po' | xargs rm -f
find debian/zabbix-frontend-php/usr/share/zabbix/locale -name '*.sh' | xargs rm -f
rm debian/zabbix-frontend-php/usr/share/zabbix/fonts/DejaVuSans.ttf
override_dh_installinit:
dh_installinit -p zabbix-agent
dh_installinit -p zabbix-java-gateway
dh_installinit --no-start -p zabbix-server-mysql --name=zabbix-server
dh_installinit --no-start -p zabbix-server-pgsql --name=zabbix-server
dh_installinit --no-start -p zabbix-proxy-mysql --name=zabbix-proxy
dh_installinit --no-start -p zabbix-proxy-pgsql --name=zabbix-proxy
dh_installinit --no-start -p zabbix-proxy-sqlite3 --name=zabbix-proxy

 

优雅地部署Zabbix – Part 1

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据