【环境介绍】
系统环境:Linux + Python 2.7.10(监控主机)
【背景描述】
需求:每次节假日或者重要时间时,需要对数据库主机信息进行检查,比如主机空间使用率之类。有时候需要执行数据库特有的命令查询信息,比如查询数据库补丁信息。但是由于主机较多需要每次登录主机进行查询,需要的时间较长。为提高批量查询或者执行命令来查询主机命令层面上的信息,需要用脚本来提高效率。
【监控优化过程及思路】
对于上面描述的问题:
- 基于执行命令需要批量登录主机,对于安全性考虑决定用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
>>>
- 主机采集信息,自带命名不需要设置,调用其他用户命令需要设置环境变量,将需要执行的命令直接加入profile配置文件中即可。
设置变量:
PATH=/home/oracle/opt/python2.7.10/bin:$ORACLE_HOME/jdk/bin:$ORACLE_HOME/OPatch:$PATH
export PATH
【测试结果及脚本】
通过测试脚本。结果如下:
- 主机数据信息:截图如下:
实现交互式执行主机命令,输入命令后直接回车即可。可以是任何主机可执行命令。
- 数据库信息:截图如下:
预先加载用户的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函数
【问题思考】
- 存在系统版本限制,需要安装多个模块;
- 存在数据库版本限制,如果调用数据库命令,需要设置环境变量;
- 存在安全性限制,用户及密码信息需要及时手动清理,可手动加载主机信息文件。
【总结】
- 实现交互式在多个主机需要检查主机命令层面信息,提高信息查询效率非常明显。
- 本次脚本涉及调用Oracle用户的变量,对用户的变量设置标准有较大的要求。
- 【Shell实战】批量在多台服务器上执行命令
功能说明:批量在多台服务器上执行命令 #!/bin/bash # ========================================== # 功能:批量在多台服务器上执行命令 # 方法: ...
- linux-xshell同时向多台服务器一起发命令
概述:有时候我们要往多台linux服务器上面步东西,一台一台布能烦死我们.如果能同时向多台服务器发命令岂不美哉. 开工: 首先打开exshell,查看->撰写栏 打开 然后瓷砖排序,看起来方便 ...
- 使用rsync, 向另外一台服务器同步目录和文件的脚本
#!/bin/bash #亚特兰蒂斯-同步目录#定时任务ini_file="/usr/local/sunlight/conf/rsync-file.ini"target_ip=&q ...
- 在linux服务器下日志提取的python脚本(实现输入开始时间和结束时间打包该时间段内的文件)
1.需求:近期在提取linux服务器下的日志文件时总是需要人工去找某个时间段内的日志文件,很是枯燥乏味,于是乎,我就想着用python结合linux指令来写一个日志提取的脚本,于是就有了以下脚本文件: ...
- Linux课程---16、apache虚拟主机设置(如何在一台服务器上配置三个域名)
Linux课程---16.apache虚拟主机设置(如何在一台服务器上配置三个域名) 一.总结 一句话总结:有三个网站www.lampym.com,bbs.lampym.com,mysql.lampy ...
- zabbix 创建主机、主机群组、监控第一台服务器
前面介绍了zabbix服务器和zabbix agent的安装配置,今天使用zabbix监控第一台服务器. 1. 安装zabbix agent 在被监控的服务器上安装zabbix agent . 参考& ...
- 通过一台服务器ssh多台主机远程修改网卡ip
在多台服务器环境下,更改所有的ip地址,网关,一台一台的登录修改显得复杂繁琐. 知识点: 参考#https://www.cnblogs.com/youngerger/p/9104144.html ...
- Dynamics CRM与ADFS安装到同一台服务器后ADFS服务与Dynamics CRM沙盒服务冲突提示808端口占用问题
当我们安装Dynamics CRM的产品时如果是单台服务器部署而且部署了IFD的情况会遇到一个问题就是ADFS服务的监听端口和Dynamics CRM沙盒服务的端口冲突了. 这样会导致两个服务中的一个 ...
- PHP多台服务器跨域SESSION共享
网站业务规模和访问量的逐步发展,原本由单台服务器.单个域名的迷你网站架构已经无法满足发展需要. 此时我们可能会购买更多服务器,并且启用多个二级子域名以频道化的方式,根据业务功能将网站分布部署在独立的服 ...
随机推荐
- [模板] Manacher(马拉车)算法
用途 求回文子串 做法 先考虑回文子串以某字符为中心的情况,即长度为奇数 推着做,记rad[i]为以i位置为中心的最大半径(包含中点) 考虑怎么求rad[i].找之前的一个右端点最靠右的位置p,设它的 ...
- 【php】 php获取文件路径中的文件名和文件后缀方法
获取文件名 $file = realpath(__DIR__.'/images/common/../addBtn.png'); 方法一 $file = realpath(__DIR__.'/image ...
- SpringBoot构建大数据开发框架
http://blog.51cto.com/yixianwei/2047886 为什么使用SpringBoot 1.web工程分层设计,表现层.业务逻辑层.持久层,按照技术职能分为这几个内聚的部分,从 ...
- 【CH6801】棋盘覆盖
题目大意:给定一个 N*N 的棋盘,棋盘上有些位置不能防止任何东西,现用 1*2 的骨牌填充棋盘,问最多能铺多少块骨牌. 题解:由于骨牌只能覆盖相邻的两个格子,那么按照对角线进行划分的格子可以保证一定 ...
- System.Web.Optimization对脚本和样式表的压缩操作
1 是否允许样式表压缩 BundleTable.EnableOptimizations = true; 在MVC项目中的 BundleConfig操作中是微软已经给我们准备好的CSS和JS压缩,我们可 ...
- Xml一(基本语法和约束)、
XML:eXtensible Markup Language 可扩展标记语言 version="1.0" * 可扩展:所有的标签都是自定义的. * 功能:数据存储 * 配置文件 * ...
- tensorflow-gpu版本出现libcublas.so.8.0:cannot open shared object file
文章主要参考以下博客https://www.aliyun.com/zixun/wenji/1289957.html 在利用GPU加速tensorflow时,出现了libcublas.so.8.0:ca ...
- Educational Codeforces Round 55 (Rated for Div. 2) A - Vasya and Book
传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: 一本书有n页,每次只能翻 d 页,问从x页到y页需要翻动几次? 注意:往前翻最 ...
- sql>desc 存储包——查看包内存储过程、函数
sql>desc dbms_random: 查询dbms_random包下的存储过程和函数 a. value() 用于返回两个数值之间的随机数, value (low, high) SQL &g ...
- Go-day02
Go程序的基本结构 ***func init() 会在main函数之前执行 1.包中的函数调用 a.同一个包中函数,直接调用 b.不同包中函数,通过包名+点+函数名进行调用 2.包的访问控制规则 a. ...