python一次调用多个脚本_一步一步学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 <

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值