大致逻辑架构:
1、 使用 shell 建立待同步文件夹中文件列表和对应MD5的列表,举例:
/opt/filesever/doc{01..05} 文件夹待同步, /opt/fileserver/source.csv 包含内容如下:
# /opt/fileserver/source.csv name,path,listfile,listMD5 doc01,/opt/fileserver/doc01,/opt/fileserver/doc01/filelist,58f2f94d5f203fe8346a318fadfad0e9 doc02,/opt/fileserver/doc02,/opt/fileserver/doc02/filelist,2ddb30e58b0cfe63db78b65432a33787 doc03,/opt/fileserver/doc03,/opt/fileserver/doc03/filelist,fc081c6d108e7c61abec32639a58da43 doc04,/opt/fileserver/doc04,/opt/fileserver/doc04/filelist,454733f9bd7d0e8a4577de3ffdeb3bdd doc05,/opt/fileserver/doc05,/opt/fileserver/doc05/filelist,e2761ae824d2079318ad5dfb148999a1
其中 /opt/fileserver/doc01/filelist 包含了 /opt/fileserver/doc01/ 文件夹内所有子文件的路径和MD5,其他对应内容结构也一样,内容如下:
# /opt/fileserver/doc01/filelist 0ade138937c4b9cb36a28e2edb6485fc /opt/fileserver/doc01/file01 72b2ac90f7f3ff075a937d6be8fc3dc3 /opt/fileserver/doc01/file02 9dc2ce470165e32478cf71a1e012ba49 /opt/fileserver/doc01/file03 27cd219f0d32980d06b997a70adc4c86 /opt/fileserver/doc01/file04 b139c77ba8b1eac2f15af1cd4e97d1f5 /opt/fileserver/doc01/file05
Zabbix 监控 fileserver的 /opt/fileserver/source.csv 内容,自动发现规则添加 /opt/filesever/doc{01..05}/filelist 文件是否存在且获取其 MD5,与 source.csv 内容中对应MD5对比,当 fileserver中的内容有更新,脚本更新 source.csv内容,Zabbix获取到变化之后,自动更新同步到触发规则的主机。在自动发现规则中可以设置需要同步或者排除的目录。
大致步骤:
-
shell脚本于 fileserver 生成需要同步文件列表。(shell)
-
Zabbix创建模板 Templates 自动发现规则 Discovery——监控 Items & 触发器 Triggers。(根据 source.csv列表,自动发现创建监控 listfile 的 MD5,以及对比和 source.csv中对应MD5的触发器)
-
创建触发器动作关联到同步脚本。(shell)
-
关联自动发现规则到需要同步主机或模板。
1、 准备工作
安装了 Zabbix https://www.sevenfal.com/2022/02/10/1853.html
于 fileserver 使用脚本生成csv格式待检查同步内容。
#!/bin/bash docList="doc01 doc02 doc03 doc04 doc05" # 待检查同步的文件夹 pathSource="/opt/fileserver" # 待检测同步的文件夹所在的文件夹 csvfile="/opt/fileserver/source.csv" # 生成用于 Zabbix 获取的csv文件保存路径 filelist="filelist" # 生成的待同步文件列表文件,请确认 docList 中不存在此文件,否则请改名,否则将会覆盖同名文件 function getMD5list() { # 用于生成待同步文件夹中文件的路径和MD5 if [ -d "$1" ];then find "$1" -type f ! -name "$filelist" -exec md5sum {} \; > "${1}/${filelist}" fi } function getCsv() { # 生成用于 Zabbix 获取的csv文件 local path_ local doc_ local output_ local listpath_ path_="$1" docs_="$2" output_="$3" for doc in ${docs_};do listpath_="${path_}/${doc}" getMD5list "${listpath_}" md5_="$(md5sum "${listpath_}/filelist" | awk '{print $1}')" echo "${doc},${listpath_},${listpath_}/filelist,${md5_}" >> "$output_" done } echo 'name,path,listfile,listMD5' > "$csvfile" getCsv "$pathSource" "$docList" "$csvfile" # 如需其他不同文件目录,可以重新定义脚本开头变量内容并重新执行上一行内容
于 Zabbix Server 设置获取 fileserver:/opt/fileserver/source.csv 文件内容的 额外检查 脚本(开放式命令,后续可用于其他内容获取):
# 安装 zabbix-get yum install zabbix-get -y # 生成额外检查脚本 cat > /usr/lib/zabbix/externalscripts/zabbix_get_.sh<<'EOF' #!/bin/bash host="$1" port="$2" keys="$3" which zabbix_get >/dev/null || exit 1 zabbix_get -s "$host" -p "$port" -k "$keys" EOF chmod +x /usr/lib/zabbix/externalscripts/zabbix_get_.sh # 重启 systemctl restart zabbix-agent
目前版本不允许模板中的触发器,存在模板和主机,而此处需要固定获取主机内容作为监控和触发器,所以只有2个办法:
1、 通过计算值
2、 通过自定义命令或者脚本
来自于 —— https://www.zabbix.com/forum/zabbix-help/27111-making-triggers-between-templates-and-hosts
--tls-connect tls连接类型 --tls-ca-file pem文件路径 --tls-cert-file crt文件路径 --tls-key-file key文件路径
2、 创建 自动发现模板
Zabbix web —— 配置 Configuration —— 模板 Templates —— 创建模板 Create Template —— 填入 模板名称 Template Name ——Linux files rsync(可自定义)
设置模板 宏 Macros ,填入对应内容
保存更新 Update 之后,在 自动发现规则 Discovery rules 里面创建 自动发现规则:
类型 Type 为: 额外检查 External check
键值 Key 为: zabbix_get_.sh["{$RSYNC.SERVER.ADDR}","{$RSYNC.SERVER.PORT}","vfs.file.contents[{$RSYNC.SERVER.LIST}]"]
进程 Preprocessing 设置 预定步骤 Step : CSV to JSON
LLD Macros 设置如下:
过滤器 Filters 可设置需要或者不需要同步的文件夹, 根据 {#NAME} 或者其他规则自定义匹配
保存更新 Update, 创建 监控原型 Item prototypes —— 监控 {#LISTFILE} 是否存在的监控项,信息类型 Type of information 为: 数字(无正负) Numeric (unsigned)
保存更新 Update 后,继续创建 监控原型 Item prototypes —— 监控获取 {#LISTFILE} 文件 MD5 的监控项,注意 信息类型 Type of information 为: 字符 Character
保存更新 Update 后,创建 触发器原型 Trigger protoTypes,表达式 Expression 为:
last(/Linux files rsync/vfs.file.md5sum[{#LISTFILE}])<>{#LISTMD5} or last(/Linux files rsync/vfs.file.exists[{#LISTFILE}])=0
当主机本地 {#LISTFILE} 的MD5和服务器列表文件MD5值不一样,或者 本地 {#LISTFILE} 不存在时(第一次同步之前)触发
3、 设置触发器动作,关键到消息发送脚本设置同步操作
触发器 发出 主机需要同步文件的通知了,通常这里是到了 报警媒介类型 Media 步骤,为 Zabbix 发送通知信息的部分,包括不限于 邮件、短信SMS等等通知,在 Zabbix Server 上能看到问题通知,这时怎么由 Zabbix Sever 自动去执行同步就是需要思考解决的。 原本文采用 报警媒介类型 的方式操作更新文件步骤。
但通常执行同步操作是在 fileserver 上使用 rsync 命令同步文件到 主机:
fileserver ——> rsync ——> 主机
由于这是 Zabbix Server,权限就比较麻烦,除非你的 Zabbix Server 和 fileserver 是同一台机器,那么你可以跳过此步骤直接到设置 Zabbix 动作关联部分,否则思来想去省事点这里就需要 Zabbix Server 使用 ssh 远程执行 fileserver 去同步:
Zabbix Server ——> ssh ——> ( fileserver ——> rsync ——> 主机 )
此处需要使用 sshkey 免密码或者使用 expect 自动输入密码,本文采用 sshkey 免密码的方式,添加 sshkey 到 fileserver, fileserver 需要有 sshkey 添加到了被监控主机上。
更详细的步骤 或使用 expect 自动输入密码请自行搜索相关资料,本文不再赘述。
采用 报警媒介类型 Media 的脚本存放于 Zabbix Server:/usr/lib/zabbix/alertscripts/ ,而且由于Zabbix Server 和 主机通讯时,主机 Zabbix-agent 通常使用 zabbix 用户获取信息,所以用于同步命令的 rsync 也是由 zabbix 用户执行操作,把 sshkey 文件放置于 /usr/lib/zabbix/.ssh 目录 。
于 Zabbix Server 添加脚本 rsync_files.sh
# 将 sshkey 放置于 /usr/lib/zabbix/.ssh/ 目录 chown -R zabbix:zabbix /usr/lib/zabbix # 注意下方 ssh 后 fileserver的地址,以及对应端口,还有待同步主机的端口,以及需要安装 rsync cat > /usr/lib/zabbix/alertscripts/rsync_docs.sh<<'EOF' #!/bin/bash host="$1" path1="$(echo "$2" | awk '{print $4}')" ssh root@fileserver -p22 -i /usr/lib/zabbix/.ssh/id_rsa \ "rsync -avzu '$path1' -e 'ssh -p22' '$host':'${path1%/*}/'" EOF chmod +x /usr/lib/zabbix/alertscripts/rsync_docs.sh
管理 Administration —— 报警媒介类型 Media types —— 创建媒体类型 Create media type , 添加如下内容:(脚本名称 Script name 为上方的脚本名称,可同步修改)
消息模板 Message templates 添加如下内容:
选项 Options 中根据你的需求设置重试次数和间隔,或者默认。
在 用户 中,将此 报警媒介 启用:
设置 Configuration —— 用户 Users —— 选中 Zabbix Administrator —— 报警媒介 Media —— 添加如下内容
设置 Configuration —— 动作 Actions —— 触发器动作 Trigger actions —— 创建动作 Create action
添加 条件 Conditions : 触发器名称 Trigger name 包含 contains 值 value rsync local path
Operations 添加如下内容:
3、 关联模板到需要同步的主机
遇到 zabbix-proxy 使用 zabbix-get 执行权限问题,没明白怎么解决,暂用ssh远程到 zabbix-server 执行代替
文章评论(0)