最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文分享Python自動化巡檢腳本

 更新時間:2026年05月22日 08:41:08   作者:劉子毅  
文章詳細介紹了自動化巡檢腳本的開發(fā)過程,從設備清單、巡檢命令、并線多線程并發(fā)巡檢到生成Excel報告,并推薦了Netmiko、NAPALM、ntc-templates、TextFSM、Paramiko等五個網(wǎng)絡自動化工具,可以幫助工程師提高工作效率

一、自動化巡檢腳本:從 3 小時到 3 分鐘

我們需要什么

一個腳本,能做到:

  1. 讀取設備清單(IP、廠商、登錄憑據(jù))
  2. 逐臺登錄,執(zhí)行預設的巡檢命令
  3. 收集結(jié)果,按設備整理
  4. 生成一份 Excel 報告,異常項自動標紅

技術(shù)棧:Netmiko + 多線程 + openpyxl

第一步:設備清單

創(chuàng)建一個 Python 文件,把設備信息寫進去。設備少可直接硬編碼,多了可換成 CSV 讀取。

devices = [
    {"host": "10.1.1.1", "device_type": "cisco_ios"},
    {"host": "10.1.1.2", "device_type": "huawei"},
    {"host": "10.1.2.1", "device_type": "cisco_ios"},
    # 把你的設備全部加進來
]

CREDENTIALS = {
    "username": "admin",
    "password": "your_password",
}

第二步:定義巡檢命令

不同廠商命令不一樣,用一個字典來做映射。你可以根據(jù)環(huán)境自由增減。

CHECK_COMMANDS = {
    "cisco_ios": [
        ("show version | include Version", "軟件版本"),
        ("show ip interface brief", "接口狀態(tài)"),
        ("show processes cpu sorted | exclude 0.00%", "CPU占用"),
        ("show memory statistics", "內(nèi)存使用"),
        ("show logging | include %", "異常日志"),
        ("show ip route summary", "路由表概要"),
    ],
    "huawei": [
        ("display version | include VRP", "軟件版本"),
        ("display ip interface brief", "接口狀態(tài)"),
        ("display cpu-usage", "CPU占用"),
        ("display memory-usage", "內(nèi)存使用"),
        ("display logbuffer | include Error", "異常日志"),
        ("display ip routing-table statistics", "路由表概要"),
    ],
}

第三步:并發(fā)巡檢(核心)

一臺一臺串行太慢,用線程池并發(fā)。30 臺設備,并發(fā) 10 線程,3 分鐘全部跑完。

from concurrent.futures import ThreadPoolExecutor, as_completed
from netmiko import ConnectHandler
from datetime import datetime

MAX_WORKERS = 10  # 同時連接 10 臺設備

def inspect_device(dev):
    """巡檢單臺設備,返回結(jié)果字典"""
    result = {
        "設備": dev["host"],
        "廠商": dev["device_type"],
        "巡檢時間": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
        "狀態(tài)": "成功",
    }

    # 合并憑據(jù)
    login = {**dev, **CREDENTIALS}

    try:
        with ConnectHandler(**login) as conn:
            commands = CHECK_COMMANDS.get(dev["device_type"], [])
            for cmd, name in commands:
                try:
                    output = conn.send_command(cmd, read_timeout=20)
                    result[name] = output.strip()
                except Exception as e:
                    result[name] = f"[執(zhí)行失敗] {e}"
    except Exception as e:
        result["狀態(tài)"] = "連接失敗"
        result["錯誤信息"] = str(e)

    return result

# 并發(fā)執(zhí)行
reports = []
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool:
    futures = {pool.submit(inspect_device, d): d for d in devices}
    for f in as_completed(futures):
        reports.append(f.result())

print(f"巡檢完成:共 {len(reports)} 臺設備")

第四步:生成 Excel 報告

拿到數(shù)據(jù)只是第一步,還得讓老板看得懂。生成帶顏色標注的 Excel,異常項自動標紅。

import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment

wb = openpyxl.Workbook()
ws = wb.active
ws.title = f"設備巡檢報告_{datetime.now():%Y%m%d}"

# 表頭
headers = ["設備", "廠商", "狀態(tài)", "軟件版本", "接口狀態(tài)",
           "CPU占用", "內(nèi)存使用", "異常日志", "路由表概要"]
header_fill = PatternFill(start_color="1F4E79", end_color="1F4E79",
                          fill_type="solid")
header_font = Font(color="FFFFFF", bold=True, size=11)

for col, h in enumerate(headers, 1):
    cell = ws.cell(row=1, column=col, value=h)
    cell.fill = header_fill
    cell.font = header_font
    cell.alignment = Alignment(horizontal="center")

# 異常標記
red_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE",
                       fill_type="solid")
red_font = Font(color="9C0006")

# 寫入數(shù)據(jù)
for row, report in enumerate(reports, 2):
    for col, key in enumerate(headers, 1):
        value = report.get(key, "")
        ws.cell(row=row, column=col, value=value)

        # 包含異常關鍵詞則標紅
        if isinstance(value, str) and any(
            kw in value.lower()
            for kw in ["down", "error", "fail", "失敗"]
        ):
            ws.cell(row=row, column=col).fill = red_fill
            ws.cell(row=row, column=col).font = red_font

# 調(diào)整列寬
for col in ws.columns:
    ws.column_dimensions[col[0].column_letter].width = 22

filename = f"巡檢報告_{datetime.now():%Y%m%d}.xlsx"
wb.save(filename)

運行效果

巡檢完成:共 30 臺設備
報告已生成:巡檢報告_20260521.xlsx

打開 Excel,所有設備一目了然。有異常的自動標紅,發(fā)給領導比你手動填的表格專業(yè)十倍。

進階方向

這個腳本只是一個起點。你可以在此基礎上:

  • 接飛書/釘釘/企微機器人:異常設備自動推送告警
  • 接數(shù)據(jù)庫:每次巡檢結(jié)果入庫,做歷史趨勢對比
  • 定時運行:crontab 每天 6 點跑一次,早上到公司直接看報告

二、會用庫的網(wǎng)工,一天干別人一周的活

很多網(wǎng)工學 Python 的瓶頸不在語法,在“不知道有哪些好用的庫”。網(wǎng)絡自動化領域已經(jīng)有一套成熟的工具鏈,這篇幫你一次性搞清楚。

第一把刀:Netmiko —— 網(wǎng)絡設備的瑞士軍刀

如果你只能學一個庫,就學 Netmiko。它是 Paramiko 的上層封裝,專門為網(wǎng)絡設備做 SSH 連接優(yōu)化,支持思科、華為、H3C、Juniper 等幾十個廠商。

from netmiko import ConnectHandler

dev = {
    "device_type": "huawei_vrp",
    "host": "10.1.1.1",
    "username": "admin",
    "password": "pass",
}

try:
    with ConnectHandler(**dev) as conn:
        print("===== 設備版本信息 =====")
        print(conn.send_command("display version"))
except Exception as e:
    print("連接失?。?, e)

Netmiko 幫你自動處理廠商差異——思科 enable 模式,華為 system-view,它都自動完成。

適用場景:日常登錄設備執(zhí)行命令、配置備份、批量巡檢。

第二把刀:NAPALM —— 廠商無關的網(wǎng)絡抽象

Netmiko 的局限是命令廠商相關。思科 show ip interface brief,華為 display ip interface brief??鐝S商腳本要寫一堆 if-else。NAPALM 提供統(tǒng)一 API,換廠商不改代碼邏輯。

from napalm import get_network_driver

driver = get_network_driver("ios")
device_ip = "10.1.1.1"
username = "admin"
password = "pass"

try:
    with driver(device_ip, username, password, timeout=30) as dev:
        facts = dev.get_facts()
        print("主機名:", facts["hostname"])
        print("型號:", facts["model"])
        print("版本:", facts["os_version"])

        interfaces = dev.get_interfaces()
        print("\n接口數(shù)量:", len(interfaces))

        dev.discard_config()
except Exception as e:
    print("連接/執(zhí)行失敗:", str(e))

殺手功能 compare_config():自動比對當前配置和待下發(fā)配置,只顯示差異,變更窗口神器。

適用場景:多廠商環(huán)境、配置比對、BGP/OSPF 狀態(tài)監(jiān)控。

第三把刀:ntc-templates —— 把 show 輸出變成結(jié)構(gòu)化數(shù)據(jù)

我們每天看這樣的輸出:

Interface              IP-Address      OK? Method Status
GigabitEthernet0/0     10.1.1.1        YES NVRAM  up
GigabitEthernet0/1     unassigned      YES NVRAM  down

想在腳本里拿到“哪個接口是 down 的”,以前得寫正則解析。ntc-templates 說:不用了。

from netmiko import ConnectHandler

device = {
    "device_type": "cisco_ios",
    "host": "10.1.1.1",
    "username": "admin",
    "password": "pass"
}

with ConnectHandler(**device) as conn:
    output = conn.send_command("show ip interface brief", use_textfsm=True)

for intf in output:
    print(intf["intf"], intf["status"])

use_textfsm=True 背后就是 ntc-templates 在干活,內(nèi)置上百個廠商命令解析模板,輸出直接變成字典列表。
適用場景:任何需要結(jié)構(gòu)化解析 CLI 輸出的場景。

第四把刀:TextFSM —— 自定義解析,適配非標設備

ntc-templates 覆蓋不了的非標輸出、工控設備、安全設備,用 TextFSM 自己寫模板。

模板文件 show_int.template

Value INTF (\S+)
Value IPADDR (\S+)
Value STATUS (up|down)
Value PROTO (up|down)

Start
  ^${INTF}\s+${IPADDR}\s+${STATUS}\s+${PROTO} -> Record

解析代碼:

import textfsm

output = """Vlan1      192.168.1.1   up   up
Gigabit0/1  unassigned    down down"""

with open("show_int.template") as tmpl:
    parser = textfsm.TextFSM(tmpl)

result = parser.ParseText(output)
print(result)

寫一次模板,永久復用。

適用場景:非標設備、特殊命令輸出、工控/安全設備。

第五把刀:Paramiko —— 最靈活的底層

前面四個庫底層都是 Paramiko。一般情況下不需要直接用,但跳板機、交互式會話、特殊認證非它不可。

import paramiko
import time

ip = "10.1.1.1"
username = "admin"
password = "pass"

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

    ssh.connect(hostname=ip, username=username, password=password, port=22, timeout=10)

    # 華為等設備必須用交互式 shell
    shell = ssh.invoke_shell()
    time.sleep(1)

    shell.send("display version\n")
    time.sleep(2)

    output = shell.recv(65535).decode("utf-8")
    print(output)

    ssh.close()
except Exception as e:
    print(f"連接失?。簕str(e)}")

適用場景:跳板機環(huán)境、復雜交互、密鑰+密碼雙因素認證。

選型速查

你的需求用哪個庫
剛?cè)腴T,想連設備Netmiko
多廠商,想統(tǒng)一接口NAPALM
想看結(jié)構(gòu)化數(shù)據(jù)ntc-templates + Netmiko
非標設備,需自定義解析TextFSM
跳板機 / 特殊認證Paramiko

大部分場景,Netmiko + ntc-templates 就夠了。等你遇到多廠商環(huán)境再加 NAPALM。

總結(jié)

手工巡檢和一個個敲命令的日子該翻篇了。一個腳本加上這幾把“刀”,能把你從重復勞動里解放出來,讓你有更多時間鉆研架構(gòu)和優(yōu)化。如果你的巡檢腳本跑起來了,或者還有特殊場景不知道怎么適配,歡迎留言交流。轉(zhuǎn)發(fā)給還在手工巡檢的同事,大家一起提效。

到此這篇關于一文分享Python自動化巡檢腳本的文章就介紹到這了,更多相關Python自動化巡檢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python實現(xiàn)的拉格朗日插值法示例

    Python實現(xiàn)的拉格朗日插值法示例

    這篇文章主要介紹了Python實現(xiàn)的拉格朗日插值法,簡單介紹了拉格朗日插值法的原理并結(jié)合完整實例形式給出了拉格朗日插值法的具體實現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-01-01
  • python爬取淘寶商品詳情頁數(shù)據(jù)

    python爬取淘寶商品詳情頁數(shù)據(jù)

    這篇文章主要為大家詳細介紹了python爬取淘寶商品詳情頁數(shù)據(jù)的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • 如何使用Python?VTK繪制線條

    如何使用Python?VTK繪制線條

    這篇文章主要介紹了如何使用Python-VTK繪制線條,主要繪制直線和曲線,下面文章詳細實現(xiàn)過程需要的小伙伴可以參考一下
    2022-04-04
  • 一文詳解Python中常用的初等函數(shù)(內(nèi)置函數(shù))

    一文詳解Python中常用的初等函數(shù)(內(nèi)置函數(shù))

    初等函數(shù)是由基本初等函數(shù)經(jīng)過有限次的四則運算和復合運算所得到的函數(shù),這篇文章主要介紹了Python中常用初等函數(shù)(內(nèi)置函數(shù))的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-06-06
  • 使用Python實現(xiàn)二分法查找的示例

    使用Python實現(xiàn)二分法查找的示例

    這篇文章主要介紹了使用Python實現(xiàn)二分法查找的示例,二分法通常又叫二分查找,一般用于查找一個有序數(shù)組中的某個值的位置或者給定的特定值的插入位置,需要的朋友可以參考下
    2023-04-04
  • unittest+coverage單元測試代碼覆蓋操作實例詳解

    unittest+coverage單元測試代碼覆蓋操作實例詳解

    這篇文章主要為大家詳細介紹了unittest+coverage單元測試代碼覆蓋操作的實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 利用Python高效處理Excel數(shù)據(jù)的實踐指南

    利用Python高效處理Excel數(shù)據(jù)的實踐指南

    在當今的數(shù)據(jù)驅(qū)動時代,Python已成為數(shù)據(jù)科學家和分析師不可或缺的工具,本文將深入探討Python讀取Excel文件的方法,希望可以幫助大家輕松駕馭各種復雜的Excel數(shù)據(jù)
    2025-09-09
  • Python3+django2.0+apache2+ubuntu14部署網(wǎng)站上線的方法

    Python3+django2.0+apache2+ubuntu14部署網(wǎng)站上線的方法

    這篇文章主要介紹了Python3+django2.0+apache2+ubuntu14部署網(wǎng)站上線的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Anaconda+pycharm安裝及環(huán)境配置全過程

    Anaconda+pycharm安裝及環(huán)境配置全過程

    在使用pyCharm進行開發(fā)時,需要用到Anaconda創(chuàng)建的環(huán)境,下面這篇文章主要給大家介紹了關于Anaconda+pycharm安裝及環(huán)境配置的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 深入理解Python中各種方法的運作原理

    深入理解Python中各種方法的運作原理

    這篇文章主要介紹了深入理解Python中各種方法的運作原理,包括抽象方法和靜態(tài)方法和類方法等之間異同的比較,需要的朋友可以參考下
    2015-06-06

最新評論

绿春县| 黄大仙区| 大庆市| 武冈市| 广宁县| 门源| 石阡县| 兴仁县| 拜城县| 阳江市| 梁山县| 克拉玛依市| 清河县| 井冈山市| 喜德县| 墨竹工卡县| 富顺县| 博湖县| 衡山县| 夏津县| 博白县| 英超| 浦城县| 甘洛县| 义马市| 景宁| 连云港市| 巴塘县| 东阿县| 通化市| 策勒县| 原阳县| 韩城市| 合江县| 盐城市| 兰坪| 吉林市| 荣成市| 漾濞| 舞钢市| 城口县|