一、场景概述

    刚入职新公司的第3天,接到任务说需要获取100多台物理服务器的信息,其中有:主机名、IP地址、磁盘数量,磁盘设备编号。悲催的是现有的生产环境没有任何可用的工具去做这个事情,本想用Ansible去搞,但因对ansible还不是很熟悉,因此决定徒手撸一个脚本来实现,所以呢才有了此脚本的诞生。

二、脚本的基本思路

    1、python pexpect模块,用该模块来实现ssh连接

    2、连接后在远程主机跑相关命令

    3、返回结果

    4、返回的结果随便你怎么处理,可视化也好,分析也好,存储到数据库也行

三、代码如下

#!/usr/bin/env python
#Describe:
#	Gets the physical hard disk number of each host
#Author: Tantianran
#Email:	[email protected]
#time:	2016-10-09 17:28
# -*- coding: utf-8 -*-

import pexpect

def ssh_cmd(ip,shell_cmd):
passwd = '1qaz#EDC'
ssh = pexpect.spawn('ssh [email protected]%s "%s"' % (ip, shell_cmd))
try:
i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5)
if i == 0 :
ssh.sendline(passwd)
elif i == 1:
ssh.sendline('yes\n')
ssh.expect('password: ')
ssh.sendline(passwd)
ssh.expect('#')
ssh.sendline(shell_cmd)
ssh.expect('#')
except pexpect.EOF:
data = ssh.before    #读取shell命令运行的结果
ssh.close()
except pexpect.TIMEOUT:
print "Connect Timeout..."
ssh.close()
return data    #返回shell命令运行结果
def get_host():
cmd = '''
name=`hostname`
ip=`ifconfig eth0 | grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'`
disk=`ls -l /dev/vd[a-z] | wc -l`
list=`ls -l /dev/vd[a-z] | awk '{print $10}'`
echo "hostname:"$name "ip"$ip "disk:"$disk "info:"$list
'''
return cmd

for i in range(165,167):
ipaddr = '192.168.122.%s' % i
data = ssh_cmd(ipaddr,get_host())
print data
f = open('host_info.txt','a')
f.write(data)

四、测试环境说明

在写这个脚本的时候,建立了两台VM用来模拟生产环境的一个场景。    VM01:192.168.122.165,VM02:192.168.122.166