zoukankan      html  css  js  c++  java
  • 一步一步学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脚本配合各机器写好的脚本进行快速巡检,感觉还是很方便的。

  • 相关阅读:
    信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1312:【例3.4】昆虫繁殖
    信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1312:【例3.4】昆虫繁殖
    数数塔 NBUT 1083
    SSLZYC 2576 平台
    SSLZYC 2133 腾讯大战360
    SSLZYC 2575 给出字符串
    SSLZYC 2574 Closest
    SSLZYC 1127 方程的解数
    SSLZYC 1692 魔板
    SSLZYC 1125 集合
  • 原文地址:https://www.cnblogs.com/jyzhao/p/6429321.html
Copyright © 2011-2022 走看看