最近在客户现场,每日都需要巡检大量主机系统的备库信息。如果一台台执行,时间浪费的就太冤枉了。
参考同事之前写的一个 python 脚本,配合各主机上写好的 shell 检查脚本,实现一次操作得到所有巡检结果。
这里的 Python 脚本需要用到 paramiko 模块。
安装 paramiko 有两个先决条件,python 和另外一个名为 PyCrypto 的模块。
yum install python-crypto python-paramiko 或者
单独下载模块,python setup.py build && python setup.py install 安装。
因为我把文章分类为 "一步一步学 python" 系列,所以我将这样简单的脚本也进一步细分为 3 个过程,便于初学者理解,也体现出一个循序渐进的思路。
下面就是使用 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 只是实现连接到固定主机,并执行简单命令。
下面的 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"
下面的 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 脚本配合各机器写好的脚本进行快速巡检,感觉还是很方便的。
来源: http://www.cnblogs.com/jyzhao/p/6429321.html