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模块类似的功能,优点是小巧、灵活、能够快速使用,缺点是尚不支持交互式动作,只适合做一次性操作。