1、文件定义待管理目标主机
文件分为3列,第一列为目标主机IP地址,第二列为目标主机ssh服务端口,第3列为口令(也可以采用getpass()手工输入口令的方式实现),示例如下:
进群:960410445 即可获取数十套PDF!
[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模块类似的功能,优点是小巧、灵活、能够快速使用,缺点是尚不支持交互式动作,只适合做一次性操作。