Ansible + Shell 服务器巡检脚本

脚本概述

这是一个用于服务器日常巡检的 Shell 脚本,主要功能包括:

  •     检查多台主机的网络连通性
  •     监控CPU、内存和磁盘使用率
  •     生成详细的巡检报告
  •     通过企业微信发送告警通知

核心技术点

1. 主机批量管理

  •     使用Ansible工具远程执行命令和脚本
  •     通过主机清单文件 (ip_file) 管理所有待巡检主机

2. 资源监控技术

  •     ​​CPU监控​​:通过top命令获取CPU总使用率
  •     ​​内存监控​​:调用自定义脚本mem.sh获取内存使用率
  •     ​​磁盘监控​​:调用自定义脚本disk.sh获取磁盘使用率

3. 阈值告警机制

  •     设置多级告警阈值(警告/严重)
  •     使用颜色标记不同严重级别的问题
  •     问题计数器统计异常主机数量

4. 报告生成系统(生成三种报告文件)

  •      完整巡检结果(result_file)
  •      问题主机报告(problem_file)
  •      最终汇总报告(final_report)
  •      使用 Markdown 格式增强可读性

5. 通知集成

  •     通过企业微信Webhook API发送告警
  •     支持富文本格式(HTML样式标记)
  •     自动包含日期信息和问题摘要

脚本内容

注意事项:该脚本依赖 Ansible 工具,执行该脚本前需要提前做好以下准备工作:

  • 安装Ansible
  • 配置 ssh 免密登录(在控制节点生成SSH密钥对,并将公钥分发到所有被管理节点)
  • 配置 Ansible 主机清单 Inventory 文件(默认/etc/ansible/hosts),将脚本中ip_file中的ip都加入到 Ansible 主机清单文件中。

整体的 Shell 脚本内容如下:

$ cat /path/dailycheck.sh 
#!/bin/bash # ip_file 用于存放需要巡检的主机清单
ip_file="/path1/hosts"# result_file 用于存所有主机的巡检结果
result_file="/path1/resulted/resulted.$(date +%Y%m%d)"# problem_file 用于存放有问题/告警的主机信息
problem_file="/path1/problems/problems.$(date +%Y%m%d)"# final_report 存放巡检报告,也是发到企微群聊的最终报告
final_report=/path1/resulted/final_report_$(date +%Y%m%d).log# 检查 ip_file 文件是否存在,不存在则终止脚本执行
[ ! -f "$ip_file" ] && echo "找不到ip文件: $ip_file" && exit 1# 初始化结果文件
echo "<font color="blue">IT生产环境巡检结果</font>" > $result_file
echo -e "<font color="blue">告警详情:</font>" > $problem_file# 定义阈值
CPU_WARNING=90
CPU_CRITICAL=95
MEM_WARNING=90
MEM_CRITICAL=95
DISK_WARNING=90
DISK_CRITICAL=95# 定义问题计数器
problem_count=0# for 循环巡检主机清单中的主机
for ip in `cat $ip_file`;do# 初始化变量has_problem=0problem_details=()normal_details=()# 记录基础信息到完整日志echo -e "\n===== 主机 $ip 巡检结果 =====" >> $result_file# 检查服务器到网关的网络连通性ansible $ip -m shell -a "ping -c 2 -i 1 192.168.175.254 " > /dev/null 2>&1if [ $? -eq 0 ];thennetwork_status="网络: 可达"echo "网络正常" >> $result_fileelse network_status="<font color="red">网络不可达!</font>"problem_details+=("$ip $network_status")echo "网络状态: 不可达" >> $result_filehas_problem=1fi # 检查cpu使用率cpu_usage=$(ansible $ip -m shell -a 'top -bn1 | grep "Cpu(s)" | awk "{print \$2 + \$4}"' 2>/dev/null | sed -n '2p' | cut -d '.' -f1)if [ -n "$cpu_usage" ]; thenif [ "$cpu_usage" -ge $CPU_CRITICAL ]; thencpu_display="<font color="red">${cpu_usage}%(严重)</font>"problem_details+=("CPU: $cpu_display")has_problem=1elif [ "$cpu_usage" -ge $CPU_WARNING ]; thencpu_display="<font color="yellow">${cpu_usage}%(警告)</font>"problem_details+=("CPU: $cpu_display")has_problem=1elsecpu_display="${cpu_usage}%"fiecho "CPU使用率: $cpu_display" >> $result_fileelseecho "CPU使用率: 数据获取失败" >> $result_filefi# 检查内存使用率mem_usage=$(ansible $ip -m script -a '/path1/mem.sh' | sed -n 10p | cut -d'"' -f2 | cut -d '.' -f1)if [ -n "$mem_usage" ]; thenif [ "$mem_usage" -ge $MEM_CRITICAL ]; thenmem_display="<font color="red">${mem_usage}%(严重)</font>"problem_details+=("内存: $mem_display")has_problem=1elif [ "$mem_usage" -ge $MEM_WARNING ]; thenmem_display="<font color="yellow">${mem_usage}%(警告)</font>"problem_details+=("内存: $mem_display")has_problem=1elsemem_display="${mem_usage}%"fiecho "内存使用率: $mem_display" >> $result_fileelseecho "内存使用率: 数据获取失败" >> $result_filefi# 检查磁盘使用率disk_usage=$(ansible $ip -m script -a '/path1/disk.sh' | sed -n 10p | cut -d'"' -f2 | cut -d '.' -f1)if [ -n "$disk_usage" ]; thenif [ "$disk_usage" -ge $DISK_CRITICAL ]; thendisk_display="<font color="red">${disk_usage}%(严重)</font>"problem_details+=("磁盘: $disk_display")has_problem=1elif [ "$disk_usage" -ge $DISK_WARNING ]; thendisk_display="<font color="yellow">${disk_usage}%(警告)</font>"problem_details+=("磁盘: $disk_display")has_problem=1elsedisk_display="${disk_usage}%"fiecho "磁盘使用率: $disk_display" >> $result_fileelseecho "磁盘使用率: 数据获取失败" >> $result_filefi# 记录问题主机if [ $has_problem -eq 1 ]; thenecho "\n主机: $ip \n$network_status" >> $problem_filefor detail in "${problem_details[@]}"; doecho "$detail" >> "$problem_file"doneecho "" >> "$problem_file"problem_count=$((problem_count+1))fidone# 生成最终报告
total_hosts=$(cat "$ip_file" | wc -l)
{echo "## 巡检日期: $(date +%Y-%m-%d)"echo "## 巡检对象: IT生产环境"echo "## 总主机数: $total_hosts 台"echo "## 告警主机: $problem_count 台"if [ $problem_count -gt 0 ]; thencat $problem_fileelseecho "<font color="green">本次巡检无异常!</font>"fi
} > $final_report# 发送异常报告到企业微信
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxxxxxxxxxxxx"
FINAL_REPORT=`cat $final_report`
curl -X POST -H 'Content-Type: application/json' -d "{\"msgtype\": \"markdown\", \"markdown\": {\"content\": \"$FINAL_REPORT\"}}" $WEBHOOK_URL

可以添加 crond 定时任务,周期性执行巡检脚本

$ crontab -l
0 8 * * 1-5 /path1/dailycheck.sh

巡检脚本中嵌套的脚本有:

  • mem.sh 脚本,用于获取内存使用率
$ cat /path1/ 
#!/bin/bash
free -m | awk '/Mem:/ {printf("%.2f\n", $3/$2 * 100.0)}'
  • disk.sh 脚本,用于获取磁盘使用率
$ cat /path1/disk.sh 
#!/bin/bash
df -Th | grep -E '/\s*$|^/\s*$' | awk '{print $6}' | tr -d '%'

巡检报告

生成的巡检报告效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915477.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-rpm和yum

一、RPMRPM&#xff08;Red Hat Package Manager&#xff09;是一个用于管理 Red Hat 系列 Linux 发行版&#xff08;如 RHEL、CentOS、Fedora&#xff09;软件包的工具。RPM 允许用户以统一的格式来安装、卸载、升级和查询软件包。它是 .rpm 文件的主要工具&#xff0c;后缀名…

手推OpenGL相机的正交投影矩阵和透视投影矩阵(附源码)

概述计算OpenGL的正交投影矩阵和透视投影矩阵是有现成函数的。自己手推不是为了重复造轮子。手推一遍&#xff0c;可以极大的加强对这两个矩阵的理解。同时也可以满足一下自己求知欲。正交投影矩阵手推正交投影矩阵源码 WGMatrix4x4 WGMatrix4x4::BuildOrtho(double l, double …

【跨国数仓迁移最佳实践2】MaxCompute SQL执行引擎对复杂类型处理全面重构,保障客户从BigQuery平滑迁移

本系列文章将围绕东南亚头部科技集团的真实迁移历程展开&#xff0c;逐步拆解 BigQuery 迁移至 MaxCompute 过程中的关键挑战与技术创新。本篇为第二篇&#xff0c;跨国数仓迁移背后 MaxCompute 的统一存储格式创新。 注&#xff1a;客户背景为东南亚头部科技集团&#xff0c;…

react(基础篇)

React由Meta公司研发&#xff0c;用于构建Web和原生交互界面的库。 React 官方中文文档 查看JSX &#xff08;一&#xff09;React组件 用户界面的一部分&#xff0c;通俗的来讲&#xff0c;最小的元素组成的单元&#xff0c;可以实现部分逻辑与功能 房子的门就可以看成一个…

数据结构-哈希表(一)哈希函数、哈希表介绍、优缺点

哈希表 哈希函数哈希表使用了哈希函数来完成key到地址的快速映射&#xff0c;所以在了解哈希表之前&#xff0c;需要先明白哈希函数的概念和特点。 哈希函数的定义 哈希函数 哈希函数是一种将任意长度输入的数据&#xff0c;转换成固定长度输出的算法哈希函数H可以表示为yH(x) …

Shader开发(一)什么是渲染

前言在现代游戏开发和计算机图形学领域&#xff0c;渲染技术是连接虚拟世界与视觉呈现的关键桥梁。无论你是刚接触图形编程的新手&#xff0c;还是希望深入理解渲染原理的开发者&#xff0c;掌握渲染的核心概念都是必不可少的第一步。什么是渲染&#xff1f;渲染&#xff08;Re…

策略模式+工厂模式(案例实践易懂版)

最近,可以说这2025年度,自己更文的次数都大大减少,主要最近大环境不景气,自己职业也受到波及,学习的东西也是因为AI而变得更多, 没办法,你不学,总有人会学,关于AI的我也准备出个专辑,相信绝对帮助到大家 额,好像说多了,言归正传,我们看一下今天的主题:策略模式工厂模式 本文主要…

【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - snowNLP库实现中文情感分析

大家好&#xff0c;我是java1234_小锋老师&#xff0c;最近写了一套【NLP舆情分析】基于python微博舆情分析可视化系统(flaskpandasecharts)视频教程&#xff0c;持续更新中&#xff0c;计划月底更新完&#xff0c;感谢支持。今天讲解snowNLP库实现中文情感分析 视频在线地址&…

大根堆,小根堆,双指针

码蹄集OJ-大约 #include<bits/stdc.h> using namespace std; priority_queue<int>max2,maxDel; priority_queue<int,vector<int>,std::greater<int>>min2,minDel; const int N1e51; int n,result0,a[N]; int main( ) {cin>>n;for(int i1…

RS485和Modbus

UART协议中&#xff0c;空闲状态为高电平&#xff0c;也就是1,R25和R27&#xff0c;485收发器特性MAX485 (美信)SSP485 (国产替代)AZRS3080 (安格)供电电压5V5V3.3V ~ 5.5V静态电流300μA (接收模式)120μA (接收模式)150μA (接收模式)传输速率2.5Mbps10Mbps20Mbps总线负载能力…

【Android】交叉编译faiss库 | 问题解决

目录 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题 二 交叉编译faiss ■禁用 BLAS并交叉编译faiss ■使用 OpenBLAS 的 Android 移植版本并交叉编译faiss 三 报错处理 ■报错 ■SWIG 一 解决 FAISS 交叉编译到 Android 时的 BLAS/MKL 依赖问题

《使用 IDEA 部署 Docker 应用指南》

使用 IDEA 部署 Docker 应用的详细步骤 一、创建 Dockerfile 配置文件 在项目根目录下创建Dockerfile文件&#xff0c;配置内容如下&#xff1a; # 使用官方的OpenJDK镜像作为基础镜像 FROM openjdk:17-jdk-slim# 设置维护者信息(可选) LABEL maintainer"三木豪"# 设…

【Docker#3】Window 和 Linux 上 docker安装 相关知识

前置了解&#xff1a; X86 高并发&#xff1a;基于 x86 架构的处理器&#xff0c;在高负载下处理大量并发请求的能力。ARM &#xff1a;使用 ARM 架构处理器的移动设备&#xff0c;具有低功耗和高性能的特点。 操作系统&#xff1a; CentOS&#xff1a;基于 Red Hat Enterprise…

一次 POI 版本升级踩坑记录

前言 结论先行。 开发过程中由于可能涉及到二次开发&#xff0c;若原系统开发时间久远&#xff0c;没有达成一致规范设计&#xff0c;导致风格各异&#xff0c;确实满足当时开发场景&#xff0c;但增大了后续的更新的难度&#xff0c;容易出现俄罗斯套娃现象&#xff0c;新的更…

硬件设计学习DAY13——电源缓冲电路设计全解

每日更新教程&#xff0c;评论区答疑解惑&#xff0c;小白也能变大神&#xff01;" 目录 一.缓冲电路介绍 1.1缓冲电路的作用 1.2寄生参数的来源 1.3缓冲电路的类型 1.4常见缓冲电路设计 1.5设计原则 二.吸收与缓冲 2.1吸收与缓冲的核心作用 2.2电压尖峰与吸收措…

鸿蒙搜狐新闻如何在Native调用ArkTS方法

01前言鸿蒙作为一款新兴的智能操作系统&#xff0c;现在适配鸿蒙系统的应用越来越多&#xff0c;同时会面临三端兼容问题&#xff0c;如同一产品功能&#xff0c;需要维护iOS、Android、鸿蒙三端代码。拿文件上传、下载功能场景举例&#xff0c;同时要适配iOS、Android、鸿蒙三…

Java行为型模式---中介者模式

中介者模式基础概念中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;其核心思想是通过一个中介对象来封装一系列对象之间的交互&#xff0c;使各对象不需要显式地相互引用&#xff0c;从而降低耦合度&#xff0c;并可以独立地改变它们之间…

Python爬虫实战:研究Korean库相关技术

一、引言 1.1 研究背景与意义 随着韩流文化在全球的传播,韩语网页内容急剧增加。韩国在科技、娱乐等领域的信息具有重要研究价值。然而,韩语独特的黏着语特性(如助词体系、词尾变化)给信息处理带来挑战。传统爬虫缺乏对韩语语言特点的针对性处理,本研究旨在开发一套完整…

表单校验--数组各项独立校验

写需求时遇到一个这样的问题&#xff0c;就是校样项是多个的&#xff0c;但是其字段名称相同这时我们可以这样校验&#xff0c;注意字段之间的关联性<div v-for"(item,index) in formData.hospitalDoctorList" :key"item.key || index"><el-form-…

基于SpringBoot和leaflet-timeline-slider的历史叙事GIS展示-以哪吒2的海外国家上映安排为例

目录 前言 一、哪吒2的海外之路 1、海外征战历程 2、上映国家空间查询 二、后端接口的实现 1、模型层的实现 2、上映时间与国家 3、控制层的实现 三、基于leaflet-timeline-slider的前端实现 1、时间轴控件的引入及定义 2、时间轴绑定事件 3、成果展示 四、总结 前言…