最近在客户现场,每日都需要巡检大量主机系统的备库信息。如果一台台执行,时间浪费的就太冤枉了。

参考同事之前写的一个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脚本配合各机器写好的脚本进行快速巡检,感觉还是很方便的。

一步一步学Python(2) 连接多台主机执行脚本的更多相关文章

  1. 【Telnet】使用Telnet协议连接到远程Shell执行脚本

    介绍 本文介绍如何通过Telnet协议连接到远程Shell,执行脚本,并获取执行结果: 相关文章: <[Jsch]使用SSH协议连接到远程Shell执行脚本>http://www.cnbl ...

  2. 【Jsch】使用SSH协议连接到远程Shell执行脚本

    如果大家熟悉Linux的话,一定对ssh,sftp,scp等命令非常熟悉,ssh是一个安全协议,用来在不同系统或者服务器之间进行安全连接,SSH 在连接和传送的过程中会加密所有的数据. 但是SSH一般 ...

  3. 为什么学Python语言,只需四步全面了解Python语言

    为什么学Python语言,只需四步全面了解Python语言每个时代都会悄悄犒赏会选择的人,Python现在风口的语言Python--第三大主流编程语言Python , 是一种面向对象的解释型计算机程序 ...

  4. usb-host一步一步学(二)安卓在usb-host模式下列出当前连接的usb设备

    之前写了一个简单的例子usb-host一步一步学(一)安卓在usb-host模式下列出当前连接的usb设备,下面的这个例子是获取各种usb设备.usb接口以及usb连接点(endpoint) 正如上一 ...

  5. 一步一步学ROP之gadgets和2free篇(蒸米spark)

    目录 一步一步学ROP之gadgets和2free篇(蒸米spark) 0x00序 0x01 通用 gadgets part2 0x02 利用mmap执行任意shellcode 0x03 堆漏洞利用之 ...

  6. 一步一步学ROP之linux_x64篇

    一步一步学ROP之linux_x64篇 一.序 **ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防 ...

  7. 使用Python一步一步地来进行数据分析总结

    原文链接:Step by step approach to perform data analysis using Python译文链接:使用Python一步一步地来进行数据分析--By Michae ...

  8. 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计

    本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...

  9. 【DG】[三思笔记]一步一步学DataGuard

    [DG][三思笔记]一步一步学DataGuard 它有无数个名字,有人叫它dg,有人叫它数据卫士,有人叫它data guard,在oracle的各项特性中它有着举足轻理的地位,它就是(掌声)..... ...

随机推荐

  1. java名词解释,让你更好理解

    Java 开发工具包 (JDK) Java开发工具包是Java环境的核心组件,并提供编译.调试和运行一个Java程序所需的所有工具,可执行文件和二进制文件.JDK是一个平台特定的软件,有针对Windo ...

  2. wildfly 如何设置外网访问

    wildfly的默认配置是不支持外网访问的, 要想实现外网访问需要修改standalone.xml配置文件. 配置文件所在路径:wildfly/standalone/configuration/sta ...

  3. eQTL

    首先QTL是数量性状位点,比如身高是一个数量性状,其对应的控制基因的位点就是一个数量性状位点,而eQTL就是控制数量性状表达位点,即能控制数量性状基因(如身高基因)表达水平高低的那些基因的位点. 数量 ...

  4. linux下安装openmpi

    之前在win10的bash下折腾很久没有成功,后来经高人指点,发现其实一条命令就行了. sudo apt-get install libopenmpi-dev openmpi-bin 对的,就这一条命 ...

  5. document.form.command.value

    问题:在一个JSP页面中需要多个提交按钮,每个按钮点击后需要把同一个form提交到不同的页面进行处理 解决:用JS. <html><head><title>一个表单 ...

  6. 利用PHPCMS V9站群功能建立分站

    hosts文件就在C:\Windows\system32\drivers\etc\hosts下 用一套CMS软件系统,做多个网站,统一管理,用户可以互通,这就是所谓的站群功能.这对于运营和维护都能节省 ...

  7. js观察者模式与Model

    目的 观察者模式是常见的设计模式,可以被应用到MV*框架的Model上,来实现对数据变化的监听. 基本概念 观察者模式是一种常见的设计模式.被观察者可以被订阅(subscribe),并在状态发生改变时 ...

  8. Unity 脚本中update,fixedupdate,lateupdate等函数的执行顺序

    结论 通过一个例子得出的结论是:从先到后被执行的函数是 Awake->Start->FixedUpdate->Update->LateUpdate->OnGUI. 示例 ...

  9. Flash Socket通信的安全策略问题 843端口

    1.问题描述       将flash发布为html格式后,加载页面后,swf无法与服务器进行socket通信.Flash端显示的错误为:securityErrorHandler信息: [Securi ...

  10. 使用 GitHub, Jekyll 打造自己的免费独立博客

    使用 GitHub, Jekyll 打造自己的免费独立博客 GitHub是一个代码托管网站,现在很多开源项目都放在GitHub上. 利用GitHub,可以让全球各地的程序员们一起协作开发.GitHub ...