JumpServer批量添加资产
环境说明:我的环境是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端看到设备已经添加