一、前言 在日常運維的過程中,經常需要登錄主機去執行一些命令,有時候需要登錄一批主機執行相同的命,手動登錄執行的化效率太慢, 所以可以通過Python的paramiko模塊批量執行,本篇文章基於python2.7。 二、同步執行 根據ip列表按順序執行,缺點是如果命令耗時長,主機很多的話,執行效率較 ...
一、前言
在日常運維的過程中,經常需要登錄主機去執行一些命令,有時候需要登錄一批主機執行相同的命,手動登錄執行的化效率太慢, 所以可以通過Python的paramiko模塊批量執行,本篇文章基於python2.7。
二、同步執行
根據ip列表按順序執行,缺點是如果命令耗時長,主機很多的話,執行效率較慢
# -*- encoding: utf-8 -*- import paramiko import traceback def ssh(sys_ip, username, password, cmds): try: # 創建ssh客戶端 client = paramiko.SSHClient() # 第一次ssh遠程時會提示輸入yes或者no client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 密碼方式遠程連接 client.connect(sys_ip, 22, username=username, password=password, timeout=5) # 互信方式遠程連接 # key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa") # ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20) # 執行命令 stdin, stdout, stderr = client.exec_command(cmds) # 獲取命令執行結果,返回的數據是一個list result = stdout.readlines() if len(result)>0: return sys_ip + ":" + str(result[0]) else: return sys_ip + ":" + "none" except Exception, e: print sys_ip+" error:"+str(e) print traceback.format_exc() finally: client.close() if __name__ == "__main__": ips='''10.198.1.1 10.198.1.2 10.198.1.3 10.198.1.4 10.198.1.5 10.198.1.6 10.198.1.7 10.198.1.8 10.198.1.9 ''' #根據\n分割ip ip_list = ips.split("\n") username = "test"#主機用戶名 password = "test"#主機密碼 cmds = "pwd"#需要執行的命令 for ip in ip_list: ssh(ip, username, password, cmds)
二、非同步執行
同步執行如果機器太多耗時長,效率就比較低,就可以使用非同步方法同時執行,缺點是如果同時執行太多程式會有問題,所以加了sleep。
# -*- encoding: utf-8 -*- import time import paramiko import traceback from threading import Thread def async(f): def wrapper(*args, **kwargs): thr = Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @async def ssh(sys_ip, username, password, cmds): try: # 創建ssh客戶端 client = paramiko.SSHClient() # 第一次ssh遠程時會提示輸入yes或者no client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 密碼方式遠程連接 client.connect(sys_ip, 22, username=username, password=password, timeout=5) # 互信方式遠程連接 # key_file = paramiko.RSAKey.from_private_key_file("/root/.ssh/id_rsa") # ssh.connect(sys_ip, 22, username=username, pkey=key_file, timeout=20) # 執行命令 stdin, stdout, stderr = client.exec_command(cmds,timeout=30) # 獲取命令執行結果,返回的數據是一個list result = stdout.readlines() if len(result)>0: print sys_ip + ":" + str(result[0]) else: print sys_ip + ":" + "none"+"\n" except Exception, e: print sys_ip+" error:"+str(e)+"\n" print traceback.format_exc() finally: client.close() if __name__ == "__main__": ips='''10.198.1.1 10.198.1.2 10.198.1.3 10.198.1.4 10.198.1.5 10.198.1.6 10.198.1.7 10.198.1.8 10.198.1.9 ''' #根據\n分割ip ip_list = ips.split("\n") username = "test"#主機用戶名 password = "test"#主機密碼 cmds = "pwd"#需要執行的命令 while (True): ipl = ip_list[0:5]#每次拿五個 for ip in ipl: ssh(ip, username, password, cmds) time.sleep(3) del ip_list[0:5]#刪除5個 if len(ip_list) == 0: break#如果沒了退出