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
英文地址,請注明出處:http://en.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、成果展示 四、總結 前言…