標籤:python 主機批量管理
在日常的營運工作中批量對主機的是很常見的,市面上也有許多主機批量管理的軟體,但有時候這些軟體並不能完全的滿足我們的需求。python中剛好提供了關於主機批量管理的模組,今天就讓我們來看看如何利用python實現主機批量管理
python提供主機批量管理的模組主要有三個paramiko、fabric與pexpect,今天我們主要說的是paramiko模組,paramiko模組是第三方模組
安裝:pip install paramiko或者yum install python-paramiko如果都安裝失敗的話可以使用源碼安裝
源碼包:https://github.com/paramiko/paramiko/archive/master.zip
常用操作:
ssh = paramiko.SSHClient()//執行個體化,ssh會話類
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) //第一次串連自動回答為yes
ssh.connect(‘伺服器ip‘,連接埠,‘使用者名稱‘,‘密碼‘) //串連伺服器
stdin,stdout,stderr = ssh.exec_command("命令") //執行命令,標準輸出,命令成功返回,命令失敗返回
ssh.close() //關閉串連
上傳、下載:
get_put = paramiko.Transport((ip,port))//伺服器ip和連接埠(使用SFTP時使用)
get_put.connect(username="root", password="123.com") //串連伺服器,使用者名稱和密碼
sftp = paramiko.SFTPClient.from_transport(get_put) //使用SFTP協議
sftp.put(需要上傳的檔案,上傳檔案儲存的位置) //上傳
sftp.get(下載檔案的位置, 下載儲存的位置) //下載
主機批量管理:
#!/usr/bin/python
#-*- coding: utf-8 -*-
import paramiko
import os
def Connect(ip=‘127.0.0.1‘,Port=22,user=‘root‘,pwd=‘123.com‘):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname=ip, port=Port, username=user, password=pwd) #串連伺服器
return ssh #返回伺服器控制代碼
def IP_ADD(ip): #判斷使用者輸入的是一個地址還是位址範圍
__ip = ip.split(‘--‘)
if len(__ip) == 2: #如果是位址範圍
ip_add = __ip[0] #取出ip
ip_range = int(__ip[1]) #取出ip的最大值
host_ip_split = ip_add.split(‘.‘) #將ip以.分隔為4段
host_ip = int(host_ip_split.pop()) #取出ip的最小值
ip_3 = ‘.‘.join(host_ip_split)+‘.‘ #將已經去除了ip的最小值的剩餘部分重新拼接
host_add_range = range(host_ip,ip_range+1) #產生串連ip的範圍
add_pool = []
for i in host_add_range:
add = ip_3+str(i) #拼接為合法的ip地址
add_pool.append(add) #產生位址集區
return add_pool #返回位址集區
elif len(__ip) == 1: #如果輸入的為單個地址
valid_ip = __ip[0]
ip_value = valid_ip.split(‘.‘)[0:4] #檢測ip的合法性
[ int(i) for i in ip_value ]
return __ip #返回地址
if __name__ == ‘__main__‘:
os.system(‘clear‘)
Fa = True
while Fa:
ip = raw_input(‘請輸入一個ip地址或一個位址範圍: ‘)
exclude_ip = raw_input(‘請輸入要排除的地址: ‘)
try:
ip_list = IP_ADD(ip) #將使用者輸入的ip交給函數處理
if exclude_ip.strip(): #判斷使用者是否要排除位址集區中的地址
exclude_add = exclude_ip.split(‘,‘) #定義排除格式
[ ip_list.remove(i) for i in exclude_add ] #排除ip地址
Fa = False #退出迴圈
except:
print ‘\033[31m地址格式錯誤\033[0m‘
print ‘‘‘例:
127.0.0.1 對單台主機執行操作
127.0.0.1--254 對一個位址範圍的主機執行操作
127.0.0.8,127.0.0.10 排除位址集區中的地址
‘‘‘
continue
print ‘\033[31m輸入script_exit退出程式\033[0m‘
while True:
shell_comd = raw_input(‘請輸入執行的命令: ‘) #執行的命令
if shell_comd == ‘script_exit‘:
break
for i in ip_list: #迴圈位址集區
try:
comd = Connect(ip=i) #串連伺服器
stdin, stdout, stderr = comd.exec_command(shell_comd) #執行命令
stderr = stderr.read() #命令正確執行的結果
stdout = stdout.read() #命令錯誤執行的命令
if stdout:
print ‘\033[31m++++++++++++%s+++++++++++\033[0m‘%i
#那台伺服器執行的命令
print stdout
else:
print ‘\033[31m++++++++++++%s+++++++++++\033[0m‘%i
print stderr
except:
print ‘\033[31m%s串連失敗\033[0m‘ %i
paramiko還可以實現檔案批量下載和批量上傳,原理和批量執行命令基本一樣。
本文出自 “自動化營運” 部落格,請務必保留此出處http://hongchen99.blog.51cto.com/12534281/1910100
python實現主機批量管理