实用脚本能批量巡检吗?

wen 实用脚本 18

本文目录导读:

实用脚本能批量巡检吗?

  1. 场景一:批量检查多台 Linux 服务器的磁盘使用率(SSH 免密登录)
  2. 场景二:批量检查 Web 服务(URL)状态(Python 脚本)
  3. 场景三:使用 Ansible(企业级批量巡检框架)
  4. 如何让脚本真正“实用”地支持批量?

可以,而且这正是脚本(尤其是 Shell、Python 脚本)最擅长做的事情之一。

批量巡检通常包含以下场景:

  1. 登录多台服务器:检查系统负载、磁盘、进程、日志。
  2. 访问多个网络设备:检查接口状态、路由表、配置。
  3. 检查多个 URL/API:检查服务是否在线、证书是否过期。
  4. 检查多个数据库:检查表空间、慢查询、主从延迟。

下面直接给你 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

用法:

  1. chmod +x check_disk.sh
  2. ./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()

用法:

  1. pip install requests(如果未安装)
  2. 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,方便对接监控系统。


如何让脚本真正“实用”地支持批量?

  1. 变量化目标:不要硬编码 IP,应该从文件读取(如 hosts.txt 一行一个)或者从 CMDB 接口获取。

  2. 定义清晰的输入/输出:输出格式要统一(如 CSV 或 JSON),方便后续导入 Excel 或数据库。

  3. 处理异常:脚本必须处理网络不通、超时、权限拒绝等常见异常,否则巡检一半卡死很尴尬。

  4. 超时控制:单次连接或命令必须设超时(如 -o ConnectTimeout=5request.timeout)。

  5. 并行处理:如果你的脚本是顺序依次检查 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 框架,都可以实现,关键在于把目标列表化、把操作通用化、把结果结构化

抱歉,评论功能暂时关闭!