环境说明:我的环境是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')
# 提取sysname
sysname = 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'] # 返回节点的UUID
return 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} 不存在")
return
url = 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端看到设备已经添加