ipmi批量操作服务器
ipmi批量操作服务器

目录
[[toc]]
[toc]
前提
具备python环境,且具备impi软件环境;(windows版ipmi记得要把其路径添加到环境变量里去)
1、查看机器电源状态
v1-原始版
ip.txt
1/服务器带外ip/
2/服务器带外ip/
ipmi_powerStatus.py
1import os
2import time
3for i in open(r'ip.txt'):
4 ip=i.split("/")[1]
5 print(ip)
6 os.system("ipmitool -I lanplus -H "+ ip + " -U 服务器带外账号 -P 服务器带外密码 power status")
7 time.sleep(1)
8time.sleep(100)
v2-2023.2.28-增加单条impi命令
ip.txt
https://onedayxyy.cn/scripts/ipmi/ipmi_power_status/v2-add-single-command-2023.3.28/ip.txt
1/服务器带外ip/
2/服务器带外ip/
ipmi_powerStatus.py
1import os
2import time
3for i in open(r'ip.txt'):
4 ip=i.split("/")[1]
5 print(ip)
6 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 服务器带外密码 power status")
7 # ipmitool -I lanplus -H 10.10.10.10 -U admin -P "服务器带外密码" power status
8 time.sleep(1)
9time.sleep(100)
v3-2025.7.4-输出控制台同时保存到csv-测试成功
测试成功。
脚本位置:
D:\BaiduSyncdisk\脚本\01-ipmi脚本\查看机器电源状态\v3-2025.7.4-输出控制台同时保存到csv-测试成功

脚本详情:
ip.txt
1/192.168.1.1/
2/192.168.1.2/
ipmi.py
1import os
2import time
3import csv
4from datetime import datetime
5
6# 配置文件路径
7IP_FILE = 'ip.txt'
8OUTPUT_CSV = f'ipmi_results_{datetime.now().strftime("%Y%m%d_%H%M%S")}.csv'
9
10# IPMI 认证信息(建议改为从配置文件或环境变量读取敏感信息)
11IPMI_USER = "admin"
12IPMI_PASS = "123456"
13
14def check_power_status(ip):
15 """执行IPMI电源状态检查并返回结果"""
16 cmd = f'ipmitool -I lanplus -H {ip} -U {IPMI_USER} -P {IPMI_PASS} power status'
17 try:
18 result = os.popen(cmd).read().strip()
19 return result if result else "No response"
20 except Exception as e:
21 return f"Error: {str(e)}"
22
23def main():
24 # 创建CSV文件并写入表头
25 with open(OUTPUT_CSV, 'w', newline='') as csvfile:
26 writer = csv.writer(csvfile)
27 writer.writerow(['IP Address', 'Power Status', 'Timestamp'])
28
29 # 处理每个IP
30 with open(IP_FILE) as f:
31 for line in f:
32 if not line.strip(): # 跳过空行
33 continue
34
35 ip = line.strip().split("/")[1]
36 print(f"\nChecking IP: {ip}") # 控制台输出
37
38 # 获取电源状态
39 status = check_power_status(ip)
40 timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
41
42 # 控制台打印结果
43 print(f" Status: {status}")
44 print(f" Timestamp: {timestamp}")
45
46 # 写入CSV文件
47 writer.writerow([ip, status, timestamp])
48
49 time.sleep(1) # 防止IPMI服务阻塞
50
51 print(f"\n[SUCCESS] 所有检测完成!结果已保存到: {OUTPUT_CSV}")
52
53if __name__ == "__main__":
54 main()
2、批量从pxe启动脚本
v1-2023.11.23
ip.txt
https://onedayxyy.cn/scripts/ipmi/ipmi_pxe/v1-2023.11.23/ip.txt
1/服务器带外地址/
ipmi_pxe.py
https://onedayxyy.cn/scripts/ipmi/ipmi_pxe/v1-2023.11.23/ipmi_pxe.py
1import os
2import time
3for i in open(r'ip.txt'):
4 ip=i.split("/")[1]
5 print(ip)
6 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 chassis bootdev pxe") #从PXE启动
7 time.sleep(1)
8 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 power reset") #重启
9time.sleep(100)
shell版从pxe启动
- 代码:
1[root@docusaurus-wiki shell_pxe]# cat ip.txt
2/物理机带外ip/
3/物理机带外ip/[root@docusaurus-wiki shell_pxe]# cat ipmi_pxe_shell.sh
4#!/bin/bash
5for i in `cat /root/ipmi_ip.txt`
6do
7 impitool -H "$i" -I lanplus -U root -P 123456 chassis bootdev pxe && impitool -H "$i" -I lanplus -U root -P 123456 power reset &> /dev/null
8 if [ $? -ne 0 ]; then
9 echo $i Error
10 else
11 echo &i OK
12done[root@docusaurus-wiki shell_pxe]#
- 代码位置:
https://onedayxyy.cn/scripts/ipmi/ipmi_pxe/shell_pxe/

3、批量开关机和重启
v1-2023.11.23
ip.txt
https://onedayxyy.cn/scripts/ipmi/ipmi_powerOn_poweroff_reset/v1-2023.11.23/ip.txt
1/服务器带外地址/
ipmi_pxe.py
https://onedayxyy.cn/scripts/ipmi/ipmi_powerOn_poweroff_reset/v1-2023.11.23/ipmi_pxe.py
1import os
2import time
3for i in open(r'ip.txt'):
4 ip=i.split("/")[1]
5 print(ip)
6 # os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 chassis bootdev pxe") #从PXE启动
7 # time.sleep(1)
8 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 power reset") #重启
9 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 power on") #开机
10 os.system("ipmitool -I lanplus -H "+ ip + " -U admin -P 123456 power off") #关机
11time.sleep(100)
4、批量修改服务器带外密码
v1-2023.11.23
ip.txt
https://onedayxyy.cn/scripts/ipmi/ipmi_modify_daiwai_password/v1-2023.11.23/ip.txt
1/服务器带外地址/
ipmi_password.py
https://onedayxyy.cn/scripts/ipmi/ipmi_modify_daiwai_password/v1-2023.11.23/ipmi_password.py
1import os
2import time
3for i in open(r'ip.txt'):
4 ip=i.split("/")[1]
5 print(ip)
6 os.system("ipmitool -H "+ ip + " -I lanplus -U admin -P 123456 user set password <user id> 新密码")
7 time.sleep(1)
8time.sleep(100)
v2-2024.4.5
脚本位置:
https://onedayxyy.cn/scripts/ipmi/ipmi_modify_daiwai_password/v2-2024.4.5/
1[root@docusaurus-wiki v2-2024.4.5]#ll
2total 16
3-rw-rw-rw- 1 root root 1418 Nov 17 2021 changePassword.py
4-rw-rw-rw- 1 root root 10268 Apr 5 14:32 shanghai.xlsx
5[root@docusaurus-wiki v2-2024.4.5]#
changePassword.py
1import os
2import xlrd
3
4
5def read_File():
6 result = []
7 data = xlrd.open_workbook('shanghai.xlsx')
8 table = data.sheets()[0]
9 rowNum = table.nrows
10 for j in range(1,rowNum):
11 cj = table.cell_value(j, 0)
12 addr = table.cell_value(j, 2)
13 userName = table.cell_value(j, 3)
14 passWord = table.cell_value(j, 4)
15 newPassWord = table.cell_value(j, 5)
16 result.append([cj, addr, userName, passWord, newPassWord])
17 return result
18
19def change_Password():
20 data = read_File()
21 for j in data:
22 if j[0] =='浪潮':
23 res =os.popen('ipmitool -I lanplus -H '+j[1]+' -U ' +j[2]+' -P '+j[3]+' user set password 1 '+j[4]).read()
24 print(type(res))
25 if 'successful' in res:
26 print(j[1] + ' change Password successful')
27 else:
28 print(j[1] + ' change Password fail')
29 elif j[0] =='烽火' or j[0] == '曙光' or j[0] =='华为':
30 res =os.popen('ipmitool -I lanplus -H '+j[1]+' -U ' +j[2]+' -P '+j[3]+' user set password 2 '+j[4]).read()
31 if 'successful' in res:
32 print(j[1] + ' change Password successful')
33 else:
34 print(j[1] + ' change Password fail')
35 else:
36 print(j[1]+ f' 配置失败{j[0]}设备不在支持范围内')
37
38if __name__ == '__main__':
39 change_Password()
shanghai.xlsx

5、dell服务器修改带外ntp脚本
- 脚本位置
https://onedayxyy.cn/scripts/dell_Server_Modify_NtpServer/

ip.txt
1服务器带外地址
DELLradamNtp.py
1import os
2import time
3import paramiko
4
5for i in open(r'ip.txt'):
6 ip=i.replace('\n','')
7 print(ip)
8 ssh = paramiko.SSHClient()
9 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
10 ssh.connect(hostname=ip, port=22, username='root',password='123456')
11 stdin,stdout,stderr = ssh.exec_command("racadm set iDRAC.ntPConfigGroup.NTP1 192.168.1.1")
12 stdin,stdout,stderr = ssh.exec_command("racadm set iDRAC.ntPConfigGroup.NTP2 192.168.1.2")
13 #stdin,stdout,stderr = ssh.exec_command("testtrap -i 1")
14 #stdin,stdout,stderr = ssh.exec_command("testtrap -i 2")
15 ssh.close()
16 print("ok")
17time.sleep(100)
- 测试环境:
R730
c6320
1racadm>>racadm set iDRAC.ntPConfigGroup.NTP2 192.168.1.1
2[Key=iDRAC.Embedded.1#NTPConfigGroup.1]
3Object value modified successfully
4racadm>>
5racadm>>
6racadm>>racadm set iDRAC.ntPConfigGroup.NTP1 192.168.1.2
7[Key=iDRAC.Embedded.1#NTPConfigGroup.1]
8Object value modified successfully
9racadm>>
10racadm>>
进测试:是可以生效的。
脚本需优化:认证失败的话,脚本就退出了。。。

- 验证


