利用sshpass获取多台主机的信息
最早做运维的时候,自动化工具还不是很火热,而需要批量执行的时候一般会借助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模块 + 多线程的方式实现。但如果内网环境,安装一些自动化工具,尤其是依赖包比较多的情况下,比较难搞时,可以试试这些轻量级的玩意。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/autorun-sshpass/5091.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.