zabbix 从放弃到入门——监控 使用 RSync 同步文件

2022年2月21日 0 条评论 587 次阅读 0 人点赞
因为部分目录及文件需要同步至很多主机,所以尝试使用 Zabbix 监控文件的同步情况,以及监控到需要更新时,使用 RSync 同步需要同步的文件目录。

大致逻辑架构:
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获取到变化之后,自动更新同步到触发规则的主机。在自动发现规则中可以设置需要同步或者排除的目录。

rsync_source_teplates.png

大致步骤:

  1. shell脚本于 fileserver 生成需要同步文件列表。(shell)

  2. Zabbix创建模板 Templates 自动发现规则 Discovery——监控 Items & 触发器 Triggers。(根据 source.csv列表,自动发现创建监控 listfile 的 MD5,以及对比和 source.csv中对应MD5的触发器)

  3. 创建触发器动作关联到同步脚本。(shell)

  4. 关联自动发现规则到需要同步主机或模板。

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连接,zabbix_get 命令也需要加上tls连接参数:
--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 ,填入对应内容

image.png

保存更新 Update 之后,在 自动发现规则 Discovery rules 里面创建 自动发现规则:
类型 Type 为: 额外检查 External check
键值 Key 为: zabbix_get_.sh["{$RSYNC.SERVER.ADDR}","{$RSYNC.SERVER.PORT}","vfs.file.contents[{$RSYNC.SERVER.LIST}]"]

image.png

进程 Preprocessing 设置 预定步骤 Step : CSV to JSON

image.png

LLD Macros 设置如下:

image.png

过滤器 Filters 可设置需要或者不需要同步的文件夹, 根据 {#NAME} 或者其他规则自定义匹配

image.png

保存更新 Update, 创建 监控原型 Item prototypes —— 监控 {#LISTFILE} 是否存在的监控项,信息类型 Type of information 为: 数字(无正负) Numeric (unsigned)

image.png

保存更新 Update 后,继续创建 监控原型 Item prototypes —— 监控获取 {#LISTFILE} 文件 MD5 的监控项,注意 信息类型 Type of information 为: 字符 Character

image.png

保存更新 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} 不存在时(第一次同步之前)触发

其中 /Linux files rsync/ 为 模板名称 , 注意此处的 触发器名称 Name,后续添加动作时,需要和此处关联

image.png

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 为上方的脚本名称,可同步修改)

image.png

消息模板 Message templates 添加如下内容:

image.png
image.png

选项 Options 中根据你的需求设置重试次数和间隔,或者默认。

在 用户 中,将此 报警媒介 启用:
设置 Configuration —— 用户 Users —— 选中 Zabbix Administrator —— 报警媒介 Media —— 添加如下内容
image.png

image.png 

设置 Configuration —— 动作 Actions —— 触发器动作 Trigger actions —— 创建动作 Create action

添加 条件 Conditions : 触发器名称 Trigger name 包含 contains 值 value rsync local path
image.png

Operations 添加如下内容:

image.pngimage.png

3、 关联模板到需要同步的主机

如果主机使用 zabbix-proxy 连接,需要将相关告警、额外脚本目录,同步至 zabbix-proxy 对应目录。
遇到 zabbix-proxy 使用 zabbix-get 执行权限问题,没明白怎么解决,暂用ssh远程到 zabbix-server 执行代替

Sevenfal

这个人太懒什么东西都没留下

文章评论(0)