最早做运维的时候,自动化工具还不是很火热,而需要批量执行的时候一般会借助pssh、sshpass+脚本 这类方式完成批量执行的需求。2012年的时候当时还对ssh工具做过一篇记录---sshpass:ssh非交互式支持password参数 。近期公司购买了阿里云的平台,会在某机房上阿里云项目。所以当前的很多主机会迁移动阿里平台上去,目前很多业务模块都在做资源使用情况的调研,做为ITO部门,需要配合业务部分获取资源使用情况。而之前装过ansible的主机被人重装了,商业化的BMC在获取数据上感觉又不顺手,这里就使用sshpass + shell 的方式实现对多台主机的内存使用情况做一个统计。

一、有相同的用户和密码

sshpass的安装这里不再详述,之前的博文中有记录。第一种情况是所有主机有一个共同的用户,密码都相同的。这种情况下一个for 循环基本就解决问题了。

1、主脚本

主脚本就是要执行时要用到的脚本,原理是将要执行的脚本先scp到远程主机上,再通过ssh远程执行该命令,执行完成后删除刚刚执行的程序。使用StrictHostKeyChecking=no参数是避免ssh连接时出现yes/no的交互提示

1[root@361way sshpass]# cat main.sh
2#!/bin/bash
3for host in `cat hosts`;do
4        #echo $host mem:
5        sshpass -p 'password' scp -o StrictHostKeyChecking=no  mem.sh amos@$host:/tmp/
6        sshpass -p 'password' ssh  -o StrictHostKeyChecking=no  amos@$host "sh /tmp/mem.sh"
7        sshpass -p 'password' ssh  -o StrictHostKeyChecking=no  amos@$host "rm -rf  /tmp/mem.sh"
8done

2、需要执行的内容

这里以获取存使用情况为例。我们需要获取已用内存(不含buffer 、cache)、总内存、已用百分比、(已用+4G系统使用)/总内存的使用情况。具体脚本如下:

1#!/bin/bash 
2# usedMem(kB) TotalMEM(kB) used1_percent(no eredundance)  used1_percent(redundance)
3used=`free -m|grep 'buffers/cache'|awk '{print $(NF-1)}'`
4used_redu=`free -m|grep 'buffers/cache'|awk '{print $(NF-1)+4096}'`
5total=`cat /proc/meminfo |grep MemTotal |awk '{print $2/1024}'`
6used_value=$(echo $used $total | awk '{ printf "%0.2f\n" ,$1/$2}')
7usedredu_value=$(echo $used_redu $total | awk '{ printf "%0.2f\n" ,$1/$2}')
8dcnip=`/sbin/ifconfig|grep inet|grep 10|awk '{print $2}'`
9echo "$dcnip |  $used  | $total | $used_value | $usedredu_value "

3、需要执行的主机列表

 1[root@361way sshpass]# cat hosts
 210.211.160.64
 310.211.160.65
 410.211.160.66
 510.211.160.67
 610.211.160.68
 710.211.160.69
 810.211.160.70
 910.211.138.18
1010.211.138.19

使用时,执行sh main.sh > result.txt 即可。

二、不同的用户名和密码

这个可以参考下之前在存储自动化使用的方法(while循环 + ssh + expect实现),具体可以参看http://github.com/361way/shell 里的checktime.tar.gz (该脚本上传github不久,不过是很早之前使用的了),这里使用while循环实现。代码如下:

1、main.sh主脚本

 1#!/bin/sh
 2while read serverinfo; do
 3        sp=${serverinfo:0:1}
 4        if [ $sp == '#' ]; then
 5                continue
 6        fi
 7        IP1=`echo $serverinfo | awk -F',' '{print $1}'`
 8        USER1=`echo $serverinfo | awk -F',' '{print $2}'`
 9        PASSWD1=`echo $serverinfo | awk -F',' '{print $3}'`
10        sshpass -p "$PASSWD1" scp -o StrictHostKeyChecking=no  mem.sh $USER1@$IP1:/tmp/
11        sshpass -p "$PASSWD1" ssh  -o StrictHostKeyChecking=no  $USER1@$IP1 "sh /tmp/mem.sh"
12        sshpass -p "$PASSWD1" ssh  -o StrictHostKeyChecking=no  $USER1@$IP1 "rm -rf  /tmp/mem.sh"
13done < serverinfo.list

2、serverinfo.list主机信息文件

1[root@361way auto]# cat serverinfo.list #IP,username,userpassword
210.144.229.181,admin,admin@test
310.144.229.182,root,root123

三、总结

这里谈不上有什么创新,无法是吃老本,拿最早做运维时的东西来玩,该脚本执行起来缺点就是单线程在跑,不过其是根据列表逐个去运行,便于对结果有异常的进行比对。现在如果自己要追一个轻量级的DIY自动化工具,建议可以参照ansilbe的细路,使有python + paramiko模块 + 多线程的方式实现。但如果内网环境,安装一些自动化工具,尤其是依赖包比较多的情况下,比较难搞时,可以试试这些轻量级的玩意。