学习目标
了解Zabbix 5.0
快速搭建Zabbix
1. 简介
Zabbix在开源监控界算是比较知名的,主要是他的社区活跃,监控模板众多。虽然在云原生时代,他的设计理念可能和目前容器化架构有一些隔阂,但是并不影响他在数据中心级别监控的地位。我们常用的功能,比如:分布式服务,分布式采集,画图功能,和强大的自定义功能,都是我们在数据中心级别监控中不可或缺的。
而我们使用zabbix的最重要的原因之一,或者说zabbix之所以还依然屹立不倒的原因之一,就是他的主动发现功能。尽管他没办法像prometheus一样主动去etcd或者consul中快速查找信息,但是他可以通过一些网络手段主动去扫描特定网段中的设备,一旦发现符合特征要求的主机,就把他加到我们的主机列表中,然后通过action对这些发现的主机进行操作,比如分配模板或者是分配到指定的组当中去。
我们这次使用的是zabbix 5.0 LTS版,这个版本是目前最新的版本,他在4.xx的基础上做了一些改动。比较大的改动,比如zabbix-agent换成了go语言来开发,更轻量了,模板也增加了很多原生支持的功能,比如vsphere的支持(目前只支持6.xx的版本,对于7.0的版本支持还不好)
2. Zabbix 5.0新特性
其实我犹豫了一下到底要不要讲Zabbix,因为毕竟这个是一个被各大机构讲烂了的话题,但是作为一套完整的监控教程,又不得不说一下,以后在生产上也是用的到的,正好5.0LTS版本刚不不久,我们就接着体验的由头来给大家上手一下新版的zabbix。
目前官方列出的新特性如下,转自官方网站https://www.zabbix.com/cn/whats_new_5_0
我们可以看到,他支持一些新版本的系统了,比如CentOS/RHEL8,Ubuntu20.04和Suse15。这些都是2019年年底或者是2020年上半年才发布的操作系统。其实最令我兴奋的是,他开始支持ARM架构的CPU了(红色方框),也就是说,我们的监控可以部署在树莓派或者其他开发板上部署了。
也许有的朋友还不知道这意味着什么,大家有没有想过,如果我们在机柜上安装上一片树莓派,然后直接使用机柜来做我们zabbix的proxy-server或者zabbix-agent,这样是不是非常棒呢?如果我们想要升级,就直接在树莓派上安装一个docker和kubeproxy,然后让k8s来管理我们整个的监控系统,这样是不是能让我们的监控更加强壮呢?
这个主要说的是我们可以在云上直接使用,比如AWS的market place中直接拖拽镜像来在云上部署,而docker和openshift则是通过docker镜像来实现一键部署的
SAML的全称是安全断言标记语言(英语:Security Assertion Markup Language,简称SAML,发音sam-el)是一个基于XML的开源标准数据格式,它在当事方之间交换身份验证和授权数据,尤其是在身份提供者和服务提供者之间交换。我们可以简单理解为我们登陆时,账户的验证,授权等可以有更多的方式了。
这边是对于安全方面改进,增加了数据库的传输加密,所有的组件都可以配置加密,包括agent,proxy,还有webhook
密码从小圆点变成了锁。。。。
zabbix的内置的是TimescaleDB,数据的分区功能对于查询热点数据的速度很有帮助,高性能和可扩展性也得到了加强,但是,和新时代的监控比起来依然很慢。
新的agent由golang编写,更轻量了,速度更快,资源使用更小,可以直接从4.xx的agent升级到5.xx,不需要卸载,直接覆盖
这是一些使用上的改进
trigger更复杂了。。。
卖点功能更强大
界面改了一些,不过图形依然很low
支持自动开工单,不过要使用webhook的方式
支持的报警方式更多了
模板升级了,更多了,这也是运维喜欢使用zabbix的原因之一,监控模板非常丰富,基本满足我们的需求了
3. 快速搭建Zabbix
3.1. 官方文档:点这里
上面的是选择安装方式,但是并没有proxy-server的安装方式,我们后面会讲一下
下面是一个选择界面,通过选择不同的组合,下面会生成对应的安装方式。
3.2. 安装数据库
在新版中依然是MySQL或者PgSQL作为数据库,但是文档中没有写数据库的安装。
一般来说,这两种数据库的集群模式都是主备的模式,如果我们借助第三方工具可以实现主主模式,但是如果我们有大量的服务器的话(几千台)还是建议选择主备,主主模式如果同步不及时,就会影响数据的一致性。
如果想要减轻服务器的负担,可以考虑读写分离的方式,写请求全部去zabbix-server的主服务器去做,读请求全部分配到zabbix-server的备份服务器去做。
这个说来简单,实现的方式有两种,一种是在负载均衡器,比如:nginx上做,但是nginx的负载均衡是没有办法区分GET,PUT和UPDATE请求的,我们需要借助LUA插件来实现,或者干脆使用openresty。另外一种是让zabbix-server在连接数据库的时候,选择不同的库,zabbix-server的采集或者拉取功能全部去主库,而zabbix-server和grafana集成做展示的时候,让另外一台zabbix-server去备库拿信息。
当然,这个方式还有个要求,那就是高可用的要求,也就是说,我们还是需要借助nginx,只不过我们在upstream的时候会选择一个机器作为backup机器,只有当主机器down了的时候,我们才会去backup机器。
我们这里选择的是CentOS8作为操作系统,默认的CentOS8可以使用PgSQL10作为默认的版本,但是他也支持9.6和12版本
$ dnf module list postgresql
上次元数据过期检查:0:23:14 前,执行于 2020年08月17日 星期一 10时35分00秒。
CentOS-8 - AppStream
Name Stream Profiles Summary
postgresql 9.6 client, server [d] PostgreSQL server and client module
postgresql 10 [d] client, server [d] PostgreSQL server and client module
postgresql 12 client, server [d] PostgreSQL server and client module
提示:[d]默认,[e]已启用,[x]已禁用,[i]已安装
【d】表示默认,也就是版本10,如果想要安装版本12,需要执行
$ dnf install @postgresql:12
我们把contrib包也装上,这里面是一些工具
$ dnf install postgresql-contrib
然后初始化一下,主要是为了创建数据文件,如果我们做坏了,直接删除数据文件,再初始化一下就好了
$ postgresql-setup initdb
启动PgSQL,并且配置开机启动
$ systemctl start postgresql
$ systemctl enable postgresql
3.3. 安装zabbix
配置repo
rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/8/x86_64/zabbix-release-5.0-1.el8.noarch.rpm
安装组件
$ dnf install zabbix-server-pgsql zabbix-web-pgsql zabbix-nginx-conf zabbix-agent
这里要注意,zabbix网站在国内访问时非常不稳定,有可能在选择对应的环境之后,下面的文档没有及时变化,一定要看好安装的包,这里安装的包如下:
- zabbix-server-pgsql:zabbix-server主程序,如果是mysql版本的话名字叫zabbix-server-mysql
- zabbix-web-pgsql:zabbix-server的web界面,如果是mysql版本的话叫zabbix-web-mysql
- zabbix-nginx-conf: zabbix的nginx配置,由于zabbix的界面是php的,且会使用fpm模式,所以nginx需要额外配置一下,如果是apache的叫zabbix-apache-cong
- zabbix-agent:这个就是agent了,在被监控端只安装这个就好了
3.4. 配置数据库
官网上是用sudo的方式来做的
# sudo -u postgres createuser --pwprompt zabbix
# sudo -u postgres createdb -O zabbix zabbix
# zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | sudo -u zabbix psql zabbix
我这里是用root直接登录,所以命令变成了
[root@zabbix ~]# su - postgres -c "createuser --pwprompt zabbix"
Enter password for new role: # 这里输入zabbix
Enter it again: # 重复输入zabbix
[root@zabbix ~]# su - postgres -c "createdb -O zabbix zabbix"
导入表结构
# su - zabbix -c "zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | psql"
连到数据库看一下表是不是都导入成功了
# su - zabbix -c "psql"
zabbix=> \c zabbix;
zabbix=> \d
List of relations
Schema | Name | Type | Owner
--------+----------------------------+----------+--------
public | acknowledges | table | zabbix
public | actions | table | zabbix
public | alerts | table | zabbix
public | application_discovery | table | zabbix
public | application_prototype | table | zabbix
注意:这里的schema名字叫public
,我们后面会用到
然后需要修改下pg_hba.conf文件,配置psql的访问权限
# TYPE DATABASE USER ADDRESS METHOD
# zabbix
local zabbix zabbix md5 # <= 这行是新加的
host zabbix zabbix 127.0.0.1/32 md5 # <= 这行是新加的
# "local" is for Unix domain socket connections only
local all all peer
注意:一定要加在上面,因为这个文件是从上到下读取的,如果加在下面,就会被前面的规则匹配到,我们新加的就不生效了,然后需要重启数据库systemctl restart postgresql
3.5. 配置zabbix
修改/etc/zabbix/zabbix_server.conf文件
DBPassword=zabbix #改成刚才配置数据库的时候配置的密码
配置/etc/nginx/conf.d/zabbix.conf, 把下面两行的#
取消注释并且配置成我们需要的
listen 80;
server_name example.com;
配置/etc/php-fpm.d/zabbix.conf,改成我们的时区
php_value[date.timezone] = Asia/Shanghai
启动服务并且设置为开机启动
systemctl restart zabbix-server zabbix-agent nginx php-fpm
systemctl enable zabbix-server zabbix-agent nginx php-fpm
检查一下端口,这个时候zabbix-server和fpm的端口没有,我们需要在后面的图形界面中配置
netstat -untlp
0.0.0.0:80 <= # nginx的监听
0.0.0.0:10050 <= # zabbix-agent的监听
127.0.0.1:5432 <= # 数据库的监听
3.6. 图形界面配置
输入我们刚才在nginx中配置的server_name
,http://zabbix.jormun.com,就可以看到欢迎界面了。
如果是使用yum安装的,基本不会有啥问题
这边只需要填写密码zabbix,然后会报错,报错后会让我们输入schema的名字
host这里改成机器的名字,防止后面日志报错
确认无误
配置成功
使用默认的用户名和密码登录 Admin/zabbix
新版的zabbix就长这个样子了
4. 配置
4.1. 配置认证
zabbix支持的认证方式有4种
- 本地认证,就是本地账号
- http认证
- ldap认证,支持openldap,AD,或者各种使用ldap认证的服务器
- saml
需要注意的是,认证不等于授权,这种方式只支持认证,而没有授权,也就是说,登录是去找ldap服务器认证的,而授权需要手动去配置,也可以使用脚本,直接通过抓取用户的某些信息,然后根据特定的规则,直接把用户添加到数据库中,来实现权限控制。最后把这个脚本做成crontab,定期同步ldap的信息,如果是mysql的数据库,可以在git上搜索zabbix-mysql-sync项目。
我们这次使用的是AD认证,为了满足安全需求,需要在机器上安装根证书,比较麻烦
4.1.1. 准备工作
-
有一个CA根证书,xxx.cer,去找你们的AD管理员要吧
-
一个ldap用户,一般的公司会把用户account和服务的account分开,因为用户有可能变动,如果使用用户账户认证,如果这个员工离职了,AD账户被注销了,这个认证功能就不好使了,所以去找AD管理员要一个service账户
-
需要安装的包
yum -y install ca-certificates openldap-clients
-
需要打开的端口是389,如果是ssl证书是636
4.1.2. 安装证书
-
把证书cp到指定目录
ls -l /usr/share/pki/ca-trust-source/anchors CA.crt
-
更新证书
update-ca-trust
-
他会更新证书文件
/etc/ssl/certs/ca-bundle.trust.crt
4.1.3. 测试连通性
使用ldapsearch命令
ldapsearch -x "(&(objectCategory=Person)(memberof=CN=rol-infra-infra-s-g,OU=rol,OU=SecurityGroup,DC=yourdomain,DC=COM))" -LLL -H ldaps://lds.yourdomain.com:636 -b "dc=yourdomain,dc=COM" -D "cn=s000094,ou=ServiceAccount,dc=yourdomain,dc=COM" -w "YourPassword" displayname
4.1.4. 重启所有zabbix服务
systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
4.2. 界面配置
找到Administration–> Authentication–> LDAP Settings
- Enable LDAP authentication打钩
- LDAP host(ldapsearch的-H选项):ldaps://lds.yourdomain.com
- Port(ldapsearch的-H选项): 636
- Base DN(ldapsearch的-b选项): dc=yourdomain,dc=COM
- Search attribute(ldapsearch的-D选项中的ou): SAMAccountName
- Bind DN(ldapsearch的-D选项): cn=s000094,ou=ServiceAccount,dc=yourdomain,dc=COM
- Case sensitive login打钩
- Bind password(ldapsearch的-D选项中cn的密码)
- Test authentication:用你的ldap账户就可以,或者使用ServiceAccount的用户名密码
最后点击update就可以了