当前位置: 首页 > news >正文

一步一步学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连接主机执行命令
  • 2.将执行命令改为执行指定脚本
  • 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脚本配合各机器写好的脚本进行快速巡检,感觉还是很方便的。

相关文章:

  • MySQL添加用户、删除用户与授权
  • C#中HttpWebRequest的用法详解
  • Curl命令使用解析大全
  • 【AUC】二分类模型的评价指标ROC Curve
  • 真是个信息爆炸的世界
  • Nginx 和 Apache 日志记录格式设置
  • sublime的使用技巧
  • 让技术不要成为“背锅侠”!
  • Tkinter,label内容随多选框变化
  • Android井字游戏(一)首页制作
  • win7系统如何配置JAVA环境变量
  • UIWebView(1)
  • VM虚拟机安装之后出现无法自动登录到桌面以及__vmware_user__怎么办
  • 链接收藏
  • struts2使用拦截器完成登陆显示用户信息操作和Struts2的国际化
  • 〔开发系列〕一次关于小程序开发的深度总结
  • ESLint简单操作
  • k8s如何管理Pod
  • Laravel5.4 Queues队列学习
  • Mac转Windows的拯救指南
  • maya建模与骨骼动画快速实现人工鱼
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Vim 折腾记
  • yii2权限控制rbac之rule详细讲解
  • 大型网站性能监测、分析与优化常见问题QA
  • 高度不固定时垂直居中
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端之Sass/Scss实战笔记
  • 我与Jetbrains的这些年
  • 小程序01:wepy框架整合iview webapp UI
  • 用Canvas画一棵二叉树
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)大型网站架构演变和知识体系
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • *p++,*(p++),*++p,(*p)++区别?
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core WebAPI中封装Swagger配置
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .pop ----remove 删除
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [Android]通过PhoneLookup读取所有电话号码
  • [Angular 基础] - 数据绑定(databinding)
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [C# 基础知识系列]专题十六:Linq介绍
  • [C#]winform部署yolov5-onnx模型