1. 程式人生 > >一次針對多臺服務器交互式主機命令采集Python腳本編寫

一次針對多臺服務器交互式主機命令采集Python腳本編寫

.py 數據庫版本 toad 監控主機 pro efault 分享 多臺 linux

【環境介紹】 系統環境:Linux + Python 2.7.10(監控主機) 【背景描述】 需求:每次節假日或者重要時間時,需要對數據庫主機信息進行檢查,比如主機空間使用率之類。有時候需要執行數據庫特有的命令查詢信息,比如查詢數據庫補丁信息。但是由於主機較多需要每次登錄主機進行查詢,需要的時間較長。為提高批量查詢或者執行命令來查詢主機命令層面上的信息,需要用腳本來提高效率。 【監控優化過程及思路】 對於上面描述的問題:
  1. 基於執行命令需要批量登錄主機,對於安全性考慮決定用Python來進行批量登錄主機,需要Crypto和paramiko模塊模塊
Paramiko,Crypto模塊遵循SSH2協議,支持以加密和認證的方式,進行遠程服務器的連接。 安裝pycrypto模塊前提需要安裝GCC依賴包: yum -y install gcc wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz tar -xf pycrypto-2.6.tar.gz cd pycrypto-2.6/ python setup.py build && python setup.py install
安裝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 >>>
  1. 主機采集信息,自帶命名不需要設置,調用其他用戶命令需要設置環境變量,將需要執行的命令直接加入profile配置文件中即可。
設置變量: PATH=/home/oracle/opt/python2.7.10/bin:$ORACLE_HOME/jdk/bin:$ORACLE_HOME/OPatch:$PATH export PATH 【測試結果及腳本】 通過測試腳本。結果如下:
  1. 主機數據信息:截圖如下:
實現交互式執行主機命令,輸入命令後直接回車即可。可以是任何主機可執行命令。 技術分享圖片

  1. 數據庫信息:截圖如下:
預先加載用戶的profile文件配置後執行命令: source ~/.bash_profile;~/.profile;opatch version 技術分享圖片

【采集數據腳本信息】 主要實現功能的腳本如下: [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函數 【問題思考】
  1. 存在系統版本限制,需要安裝多個模塊;
  2. 存在數據庫版本限制,如果調用數據庫命令,需要設置環境變量;
  3. 存在安全性限制,用戶及密碼信息需要及時手動清理,可手動加載主機信息文件。
【總結】
  1. 實現交互式在多個主機需要檢查主機命令層面信息,提高信息查詢效率非常明顯。
  2. 本次腳本涉及調用Oracle用戶的變量,對用戶的變量設置標準有較大的要求。

一次針對多臺服務器交互式主機命令采集Python腳本編寫