環境說明:我的環境是H3C網絡設備環境
一、在linux系統環境下通過Python腳本獲取交換機信息,IP地址和設備名稱一一對應,腳本如下:
cat get_device-sysname.py
import re
from netmiko import ConnectHandler
from concurrent.futures import ThreadPoolExecutor, as_completed# 定義設備信息和登錄憑據
device_type = 'hp_comware'
username = 'yan' #以實際為準
password = 'Ywb@1' #以實際為準# 從文件中讀取交換機IP地址
with open('ping_successes_20250507_110259.txt') as f:ips = f.read().strip().splitlines()# 定義要提取系統名稱的正則表達式
regex_sysname = r"sysname\s+(.*)"# 定義處理單個設備的函數
def process_device(ip):try:print(f"Connecting to device {ip}")# 定義設備參數device = {'device_type': device_type,'host': ip,'username': username,'password': password,'secret': password, # 密碼也用作enable密碼'global_delay_factor': 2, # 增加延遲因子,確保命令執行完整}# 連接設備net_connect = ConnectHandler(**device)# 發送'dis cur'命令并獲取輸出output_dis_cur = net_connect.send_command('dis cur')# 提取sysnamesysname = re.search(regex_sysname, output_dis_cur, re.IGNORECASE).group(1).strip()# 斷開連接net_connect.disconnect()# 返回結果return f"{ip},{sysname}"except Exception as e:return f"{ip},ERROR: {str(e)}"# 使用ThreadPoolExecutor并發處理
with ThreadPoolExecutor(max_workers=20) as executor:future_to_ip = {executor.submit(process_device, ip): ip for ip in ips}with open('sysname_results.txt', 'w') as output_file:for future in as_completed(future_to_ip):result = future.result()output_file.write(result + '\n')print(f"Processed result: {result}")print("All tasks are completed.")
文檔說明
ping_successes_20250507_110259.txt-------交換機IP地址內容文檔
sysname_results.txt---------------------------------運行腳本后生成設備IP地址和設備名稱一一對應信息
生成信息格式如下
10.50.229.3 ,1#Office_Buding_1F-east-Acc2-Sec
二、但是還缺少相關信息,要添加一臺設備到JumpServer上,完整信息如下
10.50.229.3,1#Office_Buding_1F-east-Acc2-Sec,16,yab,Yqa2ws,Security-Office building
16-------------------是設備平臺的地址,我這里是H3C
平臺ID查看方式:
-
登錄 JumpServer 管理后臺(Web界面)
-
左側導航欄點擊 資產管理 > 平臺列表
-
點進進入相關平臺,就可以顯示平臺的ID信息
yab,Yqa2ws-------這是登錄設備的賬號和密碼,最好上面腳本的保持一致
Security-Office building------這里是設備所有的節點信息。
我的設備平臺、賬號密碼、設備所歸屬的節點都是一直的,所有我是通過sed工具,統一進行信息的添加的
三、
設備信息都準確后進行設備統一添加
1、獲取你JumpServer的API信息
curl -X POST http://localhost/api/v1/authentication/auth/ \? ?#localhost改為你JumpServer的IP地址
? ? ?-H 'Content-Type: application/json' \
? ? ?-d '{"username": "admin", "password": "admin"}'? ? #改為實際賬號密碼
?
cat add_device-to-JumpServer.py
import requests
import json# JumpServer 配置
jumpserver_url = 'http://10.32.254.233' # JumpServer的URL
api_token = 'PXz1DVBMxeBsFMeyUsTbkAZ2yWE9aACKFEqg' # API Token
headers = {'Content-Type': 'application/json','Authorization': f'Bearer {api_token}'
}# 設備文件路徑
device_file = 'sysname_results.txt'# 獲取節點ID
def get_node_uuid(node_name):url = f'{jumpserver_url}/api/v1/assets/nodes/'response = requests.get(url, headers=headers)if response.status_code == 200:nodes = response.json()for node in nodes:if node['name'] == node_name:return node['id'] # 返回節點的UUIDreturn None# 添加設備到JumpServer
def add_device_to_jumpserver(ip, hostname, platform, username, password, node_name):node_id = get_node_uuid(node_name)if not node_id:print(f"節點 {node_name} 不存在")returnurl = f'{jumpserver_url}/api/v1/assets/hosts/'# 請求參數,包含設備的基本信息payload = {"name": hostname,"address": ip,"platform": platform, # 平臺ID,H3C為16"admin_user": {"username": username,"password": password},"nodes": [node_id], # 使用節點的UUID"is_active": True}# 發送請求添加主機response = requests.post(url, headers=headers, data=json.dumps(payload))if response.status_code == 201:print(f'設備 {hostname} 添加成功')else:print(f'設備 {hostname} 添加失敗: {response.text}')# 讀取文件并逐行添加設備
with open(device_file, 'r') as file:for line in file:# 解析6個字段ip, hostname, platform, username, password, node_name = line.strip().split(',')add_device_to_jumpserver(ip, hostname, platform, username, password, node_name)
運行完后等1分鐘就可以在WEB端看到設備已經添加