利用sshpass获取多台主机的信息

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

一、有相同的用户和密码

<a href="https://sourceforge.net/projects/sshpass/" target="_blank" rel="noopener">sshpass</a>的安装这里不再详述,之前的博文中有记录。第一种情况是所有主机有一个共同的用户,密码都相同的。这种情况下一个for 循环基本就解决问题了。

1、主脚本

主脚本就是要执行时要用到的脚本,原理是将要执行的脚本先scp到远程主机上,再通过ssh远程执行该命令,执行完成后删除刚刚执行的程序。使用StrictHostKeyChecking=no参数是避免ssh连接时出现yes/no的交互提示
[root@361way sshpass]# cat main.sh
#!/bin/bash
for host in `cat hosts`;do
        #echo host mem:
        sshpass -p 'password' scp -o StrictHostKeyChecking=no  mem.sh amos@host:/tmp/
        sshpass -p 'password' ssh  -o StrictHostKeyChecking=no  amos@host "sh /tmp/mem.sh"
        sshpass -p 'password' ssh  -o StrictHostKeyChecking=no  amos@host "rm -rf  /tmp/mem.sh"
done

2、需要执行的内容

这里以获取存使用情况为例。我们需要获取已用内存(不含buffer &nbsp;、cache)、总内存、已用百分比、(已用+4G系统使用)/总内存的使用情况。具体脚本如下:
#!/bin/bash # usedMem(kB) TotalMEM(kB) used1_percent(no eredundance)  used1_percent(redundance)
used=`free -m|grep 'buffers/cache'|awk '{print (NF-1)}'`
used_redu=`free -m|grep 'buffers/cache'|awk '{print(NF-1)+4096}'`
total=`cat /proc/meminfo |grep MemTotal |awk '{print 2/1024}'`
used_value=(echo usedtotal | awk '{ printf "%0.2f\n" ,1/2}')
usedredu_value=(echoused_redu total | awk '{ printf "%0.2f\n" ,1/2}')
dcnip=`/sbin/ifconfig|grep inet|grep 10|awk '{print2}'`
echo "dcnip |used  | total |used_value | $usedredu_value "

3、需要执行的主机列表

<br />
[root@361way sshpass]# cat hosts
10.211.160.64
10.211.160.65
10.211.160.66
10.211.160.67
10.211.160.68
10.211.160.69
10.211.160.70
10.211.138.18
10.211.138.19
使用时,执行sh main.sh > result.txt 即可。

二、不同的用户名和密码

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

1、main.sh主脚本

#!/bin/sh
while read serverinfo; do
        sp={serverinfo:0:1}
        if [sp == '#' ]; then
                continue
        fi
        IP1=`echo serverinfo | awk -F',' '{print1}'`
        USER1=`echo serverinfo | awk -F',' '{print2}'`
        PASSWD1=`echo serverinfo | awk -F',' '{print3}'`
        sshpass -p "PASSWD1" scp -o StrictHostKeyChecking=no  mem.shUSER1@IP1:/tmp/
        sshpass -p "PASSWD1" ssh  -o StrictHostKeyChecking=no  USER1@IP1 "sh /tmp/mem.sh"
        sshpass -p "PASSWD1" ssh  -o StrictHostKeyChecking=noUSER1@$IP1 "rm -rf  /tmp/mem.sh"
done < serverinfo.list

2、serverinfo.list主机信息文件

<br />
[root@361way auto]# cat serverinfo.list #IP,username,userpassword
10.144.229.181,admin,admin@test
10.144.229.182,root,root123

三、总结

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注