一步一步學Python(2) 連接多台主機執行腳本


最近在客戶現場,每日都需要巡檢大量主機系統的備庫信息。如果一台台執行,時間浪費的就太冤枉了。
參考同事之前寫的一個python腳本,配合各主機上寫好的shell檢查腳本,實現一次操作得到所有巡檢結果。

這里的Python腳本需要用到paramiko模塊。
安裝paramiko有兩個先決條件,python和另外一個名為PyCrypto的模塊。
yum install python-crypto python-paramiko 或者
單獨下載模塊,python setup.py build && python setup.py install 安裝。

因為我把文章分類為“一步一步學python”系列,所以我將這樣簡單的腳本也進一步細分為3個過程,便於初學者理解,也體現出一個循序漸進的思路。

1.測試python連接主機執行命令

下面就是使用python,連接一台主機,並執行一條簡單的系統命令,測試python連接主機執行命令的功能可用。
[oracle@jydg ~]$ python
Python 2.6.6 (r266:84292, Sep  4 2013, 07:46:00) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import paramiko
>>> s = paramiko.SSHClient()
>>> s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> s.connect(hostname = '192.168.56.158', port = 22, username = 'oracle', password = 'oracle')
>>> sshcmd = 'df -h'
>>> stdin, stdout, stderr = s.exec_command(sshcmd)
>>> print stdout.read()
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg_linuxbase-lv_root   28G   12G   15G  46% /
tmpfs                             499M  171M  328M  35% /dev/shm
/dev/sda1                         485M   39M  421M   9% /boot

>>> s.close()
>>> exit()

將上述測試過程形成python腳本conn.py

#!/usr/bin/python
# -*- coding: utf8 -*-
#Function: 連接主機執行命令
#Usage: python conn.py
#Author: Alfred Zhao
#Created: 2017/02/22
#Version: 1.01

import paramiko

s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname = '192.168.56.158', port = 22, username = 'oracle', password = 'oracle')
sshcmd = 'df -h'
stdin, stdout, stderr = s.exec_command(sshcmd)
print stdout.read()
print stderr.read()
s.close()

腳本conn.py只是實現連接到固定主機,並執行簡單命令。

2.將執行命令改為執行指定腳本

下面的python腳本 checkdg.py,和上面腳本的主要區別就是將具體執行的命令改為一個shell腳本。這樣就可以輕松的去寫更復雜的命令。

python腳本 checkdg.py

#!/usr/bin/python
# -*- coding: utf8 -*-
#Function: Check Oracle DG Status
#Usage: python checkdg.py
#Author: Alfred Zhao
#Created: 2017/02/22
#Version: 1.01

import paramiko

s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname = '192.168.56.158', port = 22, username = 'oracle', password = 'oracle')
sshcmd = 'sh /home/oracle/checkdg.sh'
stdin, stdout, stderr = s.exec_command(sshcmd)
print stdout.read()
print stderr.read()
s.close()

注意:腳本checkdg.py只是實現連接到固定主機,並執行指定的shell腳本文件,腳本中必須設置正確的環境變量。

這里的shell腳本"/home/oracle/checkdg.sh"內容參考如下:

#!/bin/bash
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1
export ORACLE_SID=jyzhao_s
export NLS_LANG="american_america.ZHS16GBK"
export NLS_DATE_FORMAT="YYYY-MM-DD HH24:Mi:SS"
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export PATH=$ORACLE_HOME/bin:$PATH
echo '              ######    SID: '$ORACLE_SID
sqlplus -s /nolog <<EOF
connect / as sysdba
col VALUE for a20
col TIME_COMPUTED for a30
col name for a25
col UNIT for a30
col DATUM_TIME for a30
set line 400
select * from v\$dataguard_stats;
--select name,total_mb,free_mb,OFFLINE_DISKS,STATE from v\$asm_diskgroup;
exit;
EOF
df -h|egrep -e "Filesystem|lv_root"

3.將固定主機修改為主機列表

下面的python腳本 checkdg_all.py 只是將固定主機修改為主機列表,這樣就可以批量的在多台配置好的主機上執行各自的腳本,執行的具體結果一次就能匯總得到。

python腳本 checkdg_all.py

#!/usr/bin/python
# -*- coding: utf8 -*-
#Function: Check Oracle DG Status
#Usage: python checkdg_all.py
#Author: Alfred Zhao
#Created: 2017/02/22
#Version: 1.01

import paramiko

#連接指定多個主機
ipadress = ['192.168.56.158','192.168.56.158']
username = ['oracle','ora10']
password = 'oracle'
port = 22

num = 0 

s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())

for hostname in ipadress:
    print("####################################################################\
#######################################################################")
    print("              ###############################        IP Addreess:\
" + str(hostname).ljust(15) + str(username[num]) + "  ############################")

    s.connect(hostname = hostname, port = port, username = str(username[num]), password = password)
    sshcmd = 'sh /home/' + str(username[num]) + '/checkdg.sh'
    stdin, stdout, stderr = s.exec_command(sshcmd)
    print stdout.read()
    print stderr.read()
    num += 1
s.close()

這里的巧妙之處是,假設同一台主機不同用戶下分別安裝了oracle,比如我這里是oracle用戶安裝11g版本數據庫,ora10用戶安裝10g版本數據庫。
那么,這種情況可以認定為和多個主機一樣。(也就是IP地址一樣,用戶不同,那么對應的腳本路徑/home/username/checkdg.sh, 由於username不一樣,所以完全不影響)
因此,順便提一下,如果有人要求你在一台機器上安裝不同版本的oracle數據庫軟件,你最好與其溝通,建議使用不同的用戶來安裝,后期也會方便區分和維護。
同時,如果你的環境密碼不統一,甚至ssh的端口都有機器不是默認端口,你也可以修改腳本中的對應變量為數組類型。

腳本的執行結果類似如下:

[oracle@jydg python]$ python checkdg_all.py 
###########################################################################################################################################
              ###############################        IP Addreess:192.168.56.158 oracle  ############################
              ######    SID: jyzhao_s

NAME                      VALUE                UNIT                           TIME_COMPUTED                  DATUM_TIME
------------------------- -------------------- ------------------------------ ------------------------------ ------------------------------
transport lag                                  day(2) to second(0) interval   02/21/2017 11:49:48
apply lag                                      day(2) to second(0) interval   02/21/2017 11:49:48
apply finish time                              day(2) to second(3) interval   02/21/2017 11:49:48
estimated startup time    12                   second                         02/21/2017 11:49:48

Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg_linuxbase-lv_root   28G   12G   15G  46% /


###########################################################################################################################################
              ###############################        IP Addreess:192.168.56.158 ora10  ############################
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg_linuxbase-lv_root   28G   12G   15G  46% /
tmpfs                             499M  171M  328M  35% /dev/shm
/dev/sda1                         485M   39M  421M   9% /boot

這樣就可以迅速的發現問題,解決問題。
比如這里oracle用戶下11g版本的DG庫的apply lag沒有值就存在異常,需要進一步人工分析處理,而ora10用戶我只是臨時演示,並沒有安裝相應的數據庫。
至此,以后想批量巡檢其他的一些信息,都可以根據這個python腳本配合各機器寫好的腳本進行快速巡檢,感覺還是很方便的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM