【环境介绍】
  系统环境:Linux + Python 2.7.10(监控主机)
 
【背景描述】
需求:每次节假日或者重要时间时,需要对数据库主机信息进行检查,比如主机空间使用率之类。有时候需要执行数据库特有的命令查询信息,比如查询数据库补丁信息。但是由于主机较多需要每次登录主机进行查询,需要的时间较长。为提高批量查询或者执行命令来查询主机命令层面上的信息,需要用脚本来提高效率。
 
【监控优化过程及思路】
对于上面描述的问题:
  1. 基于执行命令需要批量登录主机,对于安全性考虑决定用Python来进行批量登录主机,需要Crypto和paramiko模块模块
Paramiko,Crypto模块遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。
安装pycrypto模块前提需要安装GCC依赖包:
yum -y install gcc
wget http://ftp.dlitz.net/pub/dlitz/crypto/pycrypto/pycrypto-2.6.tar.gz
tar -xf pycrypto-2.6.tar.gz
cd pycrypto-2.6/
python setup.py build && python setup.py install
 
安装paramiko模块安装报错需要安装setuptools模块:
wget https://pypi.python.org/packages/2b/27/b64860e7b208ff1dd36fe208d07bca1f9637a11fe733e2f2ceea587c3f75/paramiko-1.7.5.zip
unzip paramiko-1.7.5.zip
cd paramiko-1.7.5
python setup.py build && python setup.py install
Traceback (most recent call last):
  File "setup.py", line 6, in <module>
    from setuptools import setup, find_packages
ImportError: No module named setuptools
安装setuptools模块:
https://pypi.python.org/pypi/setuptools
unzip setuptools-38.5.1.zip
cd setuptools-38.5.1
python setup.py build &&  python setup.py install
 
测试Paramiko和Crypto模块是否正常调用:
[oracle@mysqldb1 python2.7.10]$ python
Python 2.7.10 (default, Nov 29 2017, 20:27:52)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Crypto
>>> import paramiko
>>>
  1. 主机采集信息,自带命名不需要设置,调用其他用户命令需要设置环境变量,将需要执行的命令直接加入profile配置文件中即可。
设置变量:
PATH=/home/oracle/opt/python2.7.10/bin:$ORACLE_HOME/jdk/bin:$ORACLE_HOME/OPatch:$PATH
export PATH
 
【测试结果及脚本】
通过测试脚本。结果如下:
  1. 主机数据信息:截图如下:
实现交互式执行主机命令,输入命令后直接回车即可。可以是任何主机可执行命令。

  1. 数据库信息:截图如下:
预先加载用户的profile文件配置后执行命令:
source ~/.bash_profile;~/.profile;opatch version
 

【采集数据脚本信息】
主要实现功能的脚本如下:
[oracle@mysqldb1 python]$ cat ssh_hosts.sh
######################################################################
# ssh_hosts.sh
# This script is check host data
# Author CZT
######################################################################
#!/bin/bash
cat .liebiao.txt |awk '{print $5}'|grep -v 'HOSTIP'> tmp_ipadress.txt》》》加载IP信息
cat .liebiao.txt |awk '{print $4}'|grep -v 'PASSWORD'> tmp_password.txt》》》加载密码信息
python ssh_hosts.py》》》调用Python脚本批量登录主机执行命令
 
[oracle@mysqldb1 python]$ cat .liebiao.txt
######################################################################
# liebiao.txt
# This script is hosts data
# Author CZT
######################################################################
TYPE    DBNAME  USERNAME        PASSWORD        HOSTIP
XXM     XXDB1   oracle                oracle          192.168.142.140
XXM     XXDB1   oracle                oracle          192.168.142.140
XXM     XXDB1   oracle                oracle          192.168.142.140
XXM     XXDB2   oracle                oracle          192.168.142.140
》》》安全考虑可以使用临时写入列表信息文件,主机信息可自己添加即可,IP为测试IP信息
 
[oracle@mysqldb1 python]$ cat ssh_hosts.py
######################################################################
# ssh_hosts.py
# This script is check hosts command
# Author CZT
######################################################################
import paramiko》》》加载paramiko模块
# Define the ipaddress array.》》》加载主机IP信息为数组
patch_file_name1="tmp_ipadress.txt"
inFile1= open(patch_file_name1,'r')
ipadress = []
for line1 in open(patch_file_name1):
        trainingSet = line1.split('\n')
        ipadress.append(trainingSet[0])
# Define the password array.》》》加载主机密码信息为数组
patch_file_name1="tmp_password.txt"
inFile1= open(patch_file_name1,'r')
password = []
for line2 in open(patch_file_name1):
        trainingSet = line2.split('\n')
        password.append(trainingSet[0])
 
username = 'oracle'》》》因为都是Oracle用户,只设置为唯一变量即可,不需要设置为数组用户信息
port = 22》》》因为调用主机的都是22号端口,只设置为唯一变量即可
num = 0》》》因为涉及到循环执行命令,设置num初始变量为0作为循环参考数值
 
s = paramiko.SSHClient()》》》调用paramiko模块中的SSH函数
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())》》》安全性以加密和认证的方式远程登录主机服务器
sshcmd=raw_input("Enter your sql_text: ");》》》设置交互式命令变量,可以是主机可执行的任何变量命令
 
for hostname in ipadress:》》》循环存在主机信息变量
  print("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------")
    print("-----------------------------------------------------   IP message:"+ str(hostname).ljust(15) +"   ----------------------------------------------")》》》输出主机信息作为唯一标识
    s.connect(hostname = hostname, port = port, username = username, password = str(password[num]))》》》登录主机
    stdin, stdout, stderr = s.exec_command(sshcmd)》》》调用上面交互式执行的主机命令
    print stdout.read()
    print stderr.read()》》》输出执行命令信息
    num += 1
s.close()》》》关闭paramiko模块中的SSH函数
 
 
【问题思考】
  1. 存在系统版本限制,需要安装多个模块;
  2. 存在数据库版本限制,如果调用数据库命令,需要设置环境变量;
  3. 存在安全性限制,用户及密码信息需要及时手动清理,可手动加载主机信息文件。
 
【总结】
  1. 实现交互式在多个主机需要检查主机命令层面信息,提高信息查询效率非常明显。
  2. 本次脚本涉及调用Oracle用户的变量,对用户的变量设置标准有较大的要求。

一次针对多台服务器交互式主机命令采集Python脚本编写的更多相关文章

  1. 【Shell实战】批量在多台服务器上执行命令

    功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...

  2. linux-xshell同时向多台服务器一起发命令

    概述:有时候我们要往多台linux服务器上面步东西,一台一台布能烦死我们.如果能同时向多台服务器发命令岂不美哉. 开工: 首先打开exshell,查看->撰写栏  打开 然后瓷砖排序,看起来方便 ...

  3. 使用rsync, 向另外一台服务器同步目录和文件的脚本

    #!/bin/bash #亚特兰蒂斯-同步目录#定时任务ini_file="/usr/local/sunlight/conf/rsync-file.ini"target_ip=&q ...

  4. 在linux服务器下日志提取的python脚本(实现输入开始时间和结束时间打包该时间段内的文件)

    1.需求:近期在提取linux服务器下的日志文件时总是需要人工去找某个时间段内的日志文件,很是枯燥乏味,于是乎,我就想着用python结合linux指令来写一个日志提取的脚本,于是就有了以下脚本文件: ...

  5. Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)

    Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...

  6. zabbix 创建主机、主机群组、监控第一台服务器

    前面介绍了zabbix服务器和zabbix agent的安装配置,今天使用zabbix监控第一台服务器. 1. 安装zabbix agent 在被监控的服务器上安装zabbix agent . 参考& ...

  7. 通过一台服务器ssh多台主机远程修改网卡ip

    在多台服务器环境下,更改所有的ip地址,网关,一台一台的登录修改显得复杂繁琐.   知识点: 参考#https://www.cnblogs.com/youngerger/p/9104144.html ...

  8. Dynamics CRM与ADFS安装到同一台服务器后ADFS服务与Dynamics CRM沙盒服务冲突提示808端口占用问题

    当我们安装Dynamics CRM的产品时如果是单台服务器部署而且部署了IFD的情况会遇到一个问题就是ADFS服务的监听端口和Dynamics CRM沙盒服务的端口冲突了. 这样会导致两个服务中的一个 ...

  9. PHP多台服务器跨域SESSION共享

    网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服 ...

随机推荐

  1. 「ZJOI2015」地震后的幻想乡 解题报告

    「ZJOI2015」地震后的幻想乡 想了半天,打开洛谷题解一看,最高票是_rqy的,一堆密密麻麻的积分差点把我吓跑. 据说有三种解法,然而我只学会了一种最辣鸡的凡人解法. 题意:给一个无向图\(G\) ...

  2. 在浏览器中浏览git上项目目录结构

    效果如下,参考:https://gitee.com/oschina/GitCodeTree

  3. 2018"百度之星"程序设计大赛 - 资格赛hdu6349三原色(最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6349 题目: 三原色图 Time Limit: 1500/1000 MS (Java/Others)  ...

  4. Python3 与 C# 面向对象之~继承与多态

      2.继承¶ 代码裤子:https://github.com/lotapp/BaseCode 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/mast ...

  5. KVM环境安装macOS Sierra

    一.在macOS系统中生成ISO文件:1.在App Store中搜索.下载macOS Sierra系统. App Store --> macos --> macOS Sierra --&g ...

  6. [hdu5215][Cycle]

    题目链接 思路 首先可以通过二分图染色找到奇环和一部分偶环.这个比较简单 但是还有一种偶环容易忽略. 如图(别问我为啥没节点4) 第一次可以找到1-2-3-1)这个奇环,第二次可以找到(3-5-6-3 ...

  7. Django 创建超级用户

    Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制 #创建超级用户 python manage.py creat ...

  8. 使用visual C++测试

    背景:学习一门语言最好的方式就是实际动手敲一遍.现在敲一遍的障碍是不能熟练的使用工具,特此记录下来 新建工程 新建——项目——Windows 控制台应用程序 如何新建测试用例呢? OJ试题在VS201 ...

  9. POJ 1743 Musical Theme (Hash)

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 33820   Accepted: 11259 D ...

  10. Luogu P2613 【模板】有理数取余

    题目链接 \(Click\) \(Here\) 真心没啥东西,只要能\(Get\)到在数字输入的时候按位取模,以及除数也可以直接取模就可以了.(把每个数看做乘法原理和加法原理构造起来的即可.) #in ...