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