一次針對多臺服務器交互式主機命令采集Python腳本編寫
阿新 • • 發佈:2018-02-27
.py 數據庫版本 toad 監控主機 pro efault 分享 多臺 linux 【環境介紹】
系統環境:Linux + Python 2.7.10(監控主機)
【背景描述】
需求:每次節假日或者重要時間時,需要對數據庫主機信息進行檢查,比如主機空間使用率之類。有時候需要執行數據庫特有的命令查詢信息,比如查詢數據庫補丁信息。但是由於主機較多需要每次登錄主機進行查詢,需要的時間較長。為提高批量查詢或者執行命令來查詢主機命令層面上的信息,需要用腳本來提高效率。
【監控優化過程及思路】
對於上面描述的問題:
安裝paramiko模塊安裝報錯需要安裝setuptools模塊:
wget https://pypi.python.org/packages/2b/27/b64860e7b208ff1dd36fe208d07bca1f9637a11fe733e2f2ceea587c3f75/paramiko-1.7.5.zip
unzip paramiko-1.7.5.zip
cd paramiko-1.7.5
python setup.py build && python setup.py install
Traceback (most recent call last):
File "setup.py", line 6, in <module>
from setuptools import setup, find_packages
ImportError: No module named setuptools
安裝setuptools模塊:
https://pypi.python.org/pypi/setuptools
unzip setuptools-38.5.1.zip
cd setuptools-38.5.1
python setup.py build && python setup.py install
測試Paramiko和Crypto模塊是否正常調用:
[oracle@mysqldb1 python2.7.10]$ python
Python 2.7.10 (default, Nov 29 2017, 20:27:52)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Crypto
>>> import paramiko
>>>
- 基於執行命令需要批量登錄主機,對於安全性考慮決定用Python來進行批量登錄主機,需要Crypto和paramiko模塊模塊
- 主機采集信息,自帶命名不需要設置,調用其他用戶命令需要設置環境變量,將需要執行的命令直接加入profile配置文件中即可。
- 主機數據信息:截圖如下:
- 數據庫信息:截圖如下:
【采集數據腳本信息】 主要實現功能的腳本如下: [oracle@mysqldb1 python]$ cat ssh_hosts.sh ###################################################################### # ssh_hosts.sh # This script is check host data # Author CZT ###################################################################### #!/bin/bash cat .liebiao.txt |awk ‘{print $5}‘|grep -v ‘HOSTIP‘> tmp_ipadress.txt》》》加載IP信息 cat .liebiao.txt |awk ‘{print $4}‘|grep -v ‘PASSWORD‘> tmp_password.txt》》》加載密碼信息 python ssh_hosts.py》》》調用Python腳本批量登錄主機執行命令 [oracle@mysqldb1 python]$ cat .liebiao.txt ###################################################################### # liebiao.txt # This script is hosts data # Author CZT ###################################################################### TYPE DBNAME USERNAME PASSWORD HOSTIP CRM YYDB1 oracle oracle 192.168.142.140 CRM YYDB1 oracle oracle 192.168.142.140 CRM GGDB1 oracle oracle 192.168.142.140 CRM GGDB2 oracle oracle 192.168.142.140 》》》安全考慮可以使用臨時寫入列表信息文件,主機信息可自己添加即可 [oracle@mysqldb1 python]$ cat ssh_hosts.py ###################################################################### # ssh_hosts.py # This script is check hosts command # Author CZT ###################################################################### import paramiko》》》加載paramiko模塊 # Define the ipaddress array.》》》加載主機IP信息為數組 patch_file_name1="tmp_ipadress.txt" inFile1= open(patch_file_name1,‘r‘) ipadress = [] for line1 in open(patch_file_name1): trainingSet = line1.split(‘\n‘) ipadress.append(trainingSet[0]) # Define the password array.》》》加載主機密碼信息為數組 patch_file_name1="tmp_password.txt" inFile1= open(patch_file_name1,‘r‘) password = [] for line2 in open(patch_file_name1): trainingSet = line2.split(‘\n‘) password.append(trainingSet[0]) username = ‘oracle‘》》》因為都是Oracle用戶,只設置為唯一變量即可,不需要設置為數組用戶信息 port = 22》》》因為調用主機的都是22號端口,只設置為唯一變量即可 num = 0》》》因為涉及到循環執行命令,設置num初始變量為0作為循環參考數值 s = paramiko.SSHClient()》》》調用paramiko模塊中的SSH函數 s.set_missing_host_key_policy(paramiko.AutoAddPolicy())》》》安全性以加密和認證的方式遠程登錄主機服務器 sshcmd=raw_input("Enter your sql_text: ");》》》設置交互式命令變量,可以是主機可執行的任何變量命令 for hostname in ipadress:》》》循環存在主機信息變量 print("#######################################################################################################") print("############################### IP Addreess:"+ str(hostname).ljust(15) +" ###########################")》》》輸出主機信息作為唯一標識 s.connect(hostname = hostname, port = port, username = username, password = str(password[num]))》》》登錄主機 stdin, stdout, stderr = s.exec_command(sshcmd)》》》調用上面交互式執行的主機命令 print stdout.read() print stderr.read()》》》輸出執行命令信息 num += 1 s.close()》》》關閉paramiko模塊中的SSH函數 【問題思考】
- 存在系統版本限制,需要安裝多個模塊;
- 存在數據庫版本限制,如果調用數據庫命令,需要設置環境變量;
- 存在安全性限制,用戶及密碼信息需要及時手動清理,可手動加載主機信息文件。
- 實現交互式在多個主機需要檢查主機命令層面信息,提高信息查詢效率非常明顯。
- 本次腳本涉及調用Oracle用戶的變量,對用戶的變量設置標準有較大的要求。
一次針對多臺服務器交互式主機命令采集Python腳本編寫