本文目录导读:

- 场景一:批量检查多台 Linux 服务器的磁盘使用率(SSH 免密登录)
- 场景二:批量检查 Web 服务(URL)状态(Python 脚本)
- 场景三:使用 Ansible(企业级批量巡检框架)
- 如何让脚本真正“实用”地支持批量?
可以,而且这正是脚本(尤其是 Shell、Python 脚本)最擅长做的事情之一。
批量巡检通常包含以下场景:
- 登录多台服务器:检查系统负载、磁盘、进程、日志。
- 访问多个网络设备:检查接口状态、路由表、配置。
- 检查多个 URL/API:检查服务是否在线、证书是否过期。
- 检查多个数据库:检查表空间、慢查询、主从延迟。
下面直接给你 3 个即拿即用的批量巡检脚本模板(基于常见的 Linux 运维场景),并说明如何扩展。
批量检查多台 Linux 服务器的磁盘使用率(SSH 免密登录)
这是最经典的场景,前提是巡检机与目标服务器配置了 SSH 密钥免密登录。
脚本:check_disk.sh
#!/bin/bash
# 目标服务器列表(IP 或主机名)
HOSTS="192.168.1.10 192.168.1.11 192.168.1.12"
SSH_USER="root" # 建议使用普通用户+sudo
THRESHOLD=80 # 告警阈值(百分比)
echo "========================================"
echo " 批量巡检告警 - 磁盘使用率"
echo "巡检时间:$(date)"
echo "========================================"
for host in $HOSTS; do
echo ">>> 巡检目标: $host"
# 通过 SSH 执行远程命令,提取使用率最高的分区
usage=$(ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no $SSH_USER@$host \
"df -h | awk '{if(NR>1 && \$5+0 > $THRESHOLD) print \$6 \$5}'" 2>/dev/null)
if [ $? -ne 0 ]; then
echo " [失败] 无法连接或认证失败"
elif [ -z "$usage" ]; then
echo " [正常] 所有分区使用率低于 ${THRESHOLD}%"
else
echo " [告警] 以下分区超过阈值:"
echo "$usage" | sed 's/^/ /'
fi
echo "---"
done
用法:
chmod +x check_disk.sh./check_disk.sh
扩展(增加巡检项): 只需在 SSH 命令后用 && 连接多个命令,或直接写一个远程脚本上传到目标机执行。
批量检查 Web 服务(URL)状态(Python 脚本)
如果你需要检查 100 个网站是否 200 OK,或者证书是否即将过期,用 Python 更灵活。
脚本:check_urls.py
#!/usr/bin/env python3
import requests
import datetime
import sys
# 要巡检的 URL 列表(可以改成从文件读取)
URLS = [
"https://example.com",
"https://www.baidu.com",
"https://www.google.com",
"http://你的内网服务:8080/health"
]
# 单个请求超时时间(秒)
TIMEOUT = 10
def check_one(url):
result = {"url": url, "status": "未知", "http_code": "N/A", "cert_days": "N/A"}
try:
# 忽略 SSL 证书错误(如果检查内网自签名证书,可以加上 verify=False)
r = requests.get(url, timeout=TIMEOUT, allow_redirects=True)
result["http_code"] = r.status_code
# 检查 SSL 证书还有几天过期
if url.startswith("https"):
cert_info = r.raw.connection.sock.getpeercert()
if cert_info:
# 解析证书到期时间
not_after = cert_info.get("notAfter", "")
if not_after:
expire_date = datetime.datetime.strptime(not_after, "%b %d %H:%M:%S %Y GMT")
days_left = (expire_date - datetime.datetime.utcnow()).days
result["cert_days"] = f"剩余 {days_left} 天"
# 判定状态
if 200 <= r.status_code < 400:
result["status"] = "正常"
else:
result["status"] = "告警"
except requests.exceptions.ConnectionError:
result["status"] = "告警 - 连接失败"
except requests.exceptions.Timeout:
result["status"] = "告警 - 超时"
except Exception as e:
result["status"] = f"告警 - 异常: {str(e)}"
return result
def main():
print(f"批量 URL 巡检报告 - {datetime.datetime.now()}")
print("="*60)
for url in URLS:
res = check_one(url)
print(f" [{res['status']:10s}] {res['http_code']:3s} | {res['cert_days']:15s} | {url}")
print("="*60)
if __name__ == "__main__":
main()
用法:
pip install requests(如果未安装)python3 check_urls.py
优点: 可以扩展出很多功能,比如结果写入 Excel,发送邮件或钉钉/企微告警。
使用 Ansible(企业级批量巡检框架)
如果你的机器数量几百上千,用上面纯脚本效率低且无标准输出。Ansible 是专业做这个的。
Advantage: 无需在被控机装 agent,只需 SSH + Python。
一个简单的 Playbook 示例:disk_check.yml
---
- name: 批量磁盘巡检
hosts: all # 在生产中,改为特定组,如 [webservers]
gather_facts: no
tasks:
- name: 检查根分区使用率
ansible.builtin.shell: df -h / | awk 'NR==2 {print $5}'
register: disk_usage
ignore_errors: yes
- name: 打印结果
ansible.builtin.debug:
msg: "主机 {{ inventory_hostname }} 根分区使用率: {{ disk_usage.stdout | default('连接失败') }}"
执行: ansible-playbook -i inventory.ini disk_check.yml
批量化能力极强: 只需一个命令,同时检查所有机器,结果可以输出为 JSON,方便对接监控系统。
如何让脚本真正“实用”地支持批量?
-
变量化目标:不要硬编码 IP,应该从文件读取(如
hosts.txt一行一个)或者从 CMDB 接口获取。 -
定义清晰的输入/输出:输出格式要统一(如 CSV 或 JSON),方便后续导入 Excel 或数据库。
-
处理异常:脚本必须处理网络不通、超时、权限拒绝等常见异常,否则巡检一半卡死很尴尬。
-
超时控制:单次连接或命令必须设超时(如
-o ConnectTimeout=5或request.timeout)。 -
并行处理:如果你的脚本是顺序依次检查 1000 台,会非常慢,需要改为并发或多线程:
Python 版并发(使用
concurrent.futures):from concurrent.futures import ThreadPoolExecutor, as_completed with ThreadPoolExecutor(max_workers=10) as executor: futures = {executor.submit(check_one, host) for host in hosts} for future in as_completed(futures): result = future.result() print(result)Bash 版并发:
for host in $HOSTS; do (ssh $host "df -h" | head -2) & # 后台运行 done wait #等待所有完成 echo "所有巡检完成"
| 工具/语言 | 最佳适用场景 | 批量效率 | 学习成本 |
|---|---|---|---|
| Bash Shell | 简单系统命令(磁盘、内存、进程) | 中等(可并发) | 低 |
| Python | HTTP检查、日志分析、复杂逻辑、报表 | 高(多线程) | 中 |
| Ansible | 大规模服务器、标准化巡检、需要幂等 | 非常高(内置并行) | 中高 |
直接回答你的问题:实用脚本能批量巡检吗?
能。 从简单的 for 循环 + ssh,到 Python 并发 + 告警,再到 Ansible 框架,都可以实现,关键在于把目标列表化、把操作通用化、把结果结构化。