Python实现主机批量管理工具!

1、文件定义待管理目标主机

文件分为3列,第一列为目标主机IP地址,第二列为目标主机ssh服务端口,第3列为口令(也可以采用getpass()手工输入口令的方式实现),示例如下:

进群:960410445 即可获取数十套PDF!

Python实现主机批量管理工具!

[root@bahrain test]# cat example.ips 
10.235.1.67 22 ~!@#$%^&*
10.235.1.68 22 !@#$%^&*
10.235.1.69 22 !@#@$%^&

2、使用方法

[root@bahrain test]# ./batchcommand.py example.ips "uptime"
************************************************************************************************************************
[HOST:10.200.161.67] [COMMAND:uptime Sucesses]
RESULT:
 15:03:09 up 10 days, 4:42, 2 users, load average: 0.46, 0.48, 0.26
************************************************************************************************************************
************************************************************************************************************************
[HOST:10.200.161.68] [COMMAND:uptime Sucesses]
RESULT:
 15:03:03 up 12 days, 17:41, 1 user, load average: 0.00, 0.03, 0.05
************************************************************************************************************************
************************************************************************************************************************
[HOST:10.200.161.69] [COMMAND:uptime Sucesses]
RESULT:
 15:03:03 up 12 days, 17:29, 1 user, load average: 0.02, 0.04, 0.05
************************************************************************************************************************
[root@bahrain test]# ./batchcommand.py example.ips "pvs"
************************************************************************************************************************
[HOST:10.200.161.67] [COMMAND:pvs Sucesses]
RESULT:
 PV VG Fmt Attr PSize PFree 
 /dev/sda2 system lvm2 a-- 119.70g 47.70g
************************************************************************************************************************
************************************************************************************************************************
[HOST:10.200.161.68] [COMMAND:pvs Sucesses]
RESULT:
 PV VG Fmt Attr PSize PFree 
 /dev/sda2 system lvm2 a-- 119.70g 47.70g
************************************************************************************************************************
************************************************************************************************************************
[HOST:10.200.161.69] [COMMAND:pvs Sucesses]
RESULT:
 PV VG Fmt Attr PSize PFree 
 /dev/sda2 system lvm2 a-- 119.70g 47.70g
************************************************************************************************************************

3、源代码如下

import getpass
import paramiko
import os
import sys
import threading
import logging
def remote_comm(host,port,pwd,command):
 ssh = paramiko.SSHClient()
 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 ssh.connect(hostname=host,port=port,username='root',password=pwd)
 if command =='':
 print('*'*120)
 print('No command to run ')
 print('*'*120)
 else:
 stdin,stdout,stderr = ssh.exec_command(command)
 out = stdout.read().decode(encoding='utf-8')
 err = stderr.read().decode(encoding='utf-8')
 if out:
 print('*'*120)
 print('[HOST:%s]'%host,'[COMMAND:%s Sucesses]'%command,sep=' ')
 print('RESULT:',out,sep='
',end='')
 print('*'*120)
 if err:
 print('*'*120)
 print('[HOST:%s]'%host,'[COMMAND:%s Error]'%command,sep=' ')
 print('RESULT IS',err,sep='
',end='')
 print('*'*120)
 if not err and not out:
 print('*'*120)
 print('[HOST:%s]'%host,'[COMMAND:%s Ok]'%command,sep=' ')
 print('RESULT IS','Null',sep='
',end='
')
 print('*'*120)
 ssh.close()
if __name__ == '__main__':
 if len(sys.argv) !=3:
 print('Usage:%s ipaddr_file command' % sys.argv(0))
 exit(1)
 if not os.path.isfile(sys.argv[1]):
 print('No Such file:',sys.argv[1])
 exit(2)
 filename = sys.argv[1]
 command = sys.argv[2]
 ips = []
 pwd = []
 port = [ ]
 with open(filename,'r') as f:
 for line in f:
 ips.append(line.split()[0])
 port.append(line.split()[1])
 pwd.append(line.split()[2])
 f.close()
 for ip,port,pwd in zip(ips,port,pwd):
 th = threading.Thread(target=remote_comm,args=(ip,port,pwd,command))
 th.start()
 th.join()

实现了与ansible 中command模块类似的功能,优点是小巧、灵活、能够快速使用,缺点是尚不支持交互式动作,只适合做一次性操作。

猜你喜欢

转载自blog.csdn.net/qq_42156420/article/details/86408262