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

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

2016年5月25日发表评论阅读评论
 

最早做运维的时候,自动化工具还不是很火热,而需要批量执行的时候一般会借助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
  3. for 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"
  8. done

2、需要执行的内容

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

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

3、需要执行的主机列表

  1. [root@361way sshpass]# cat hosts
  2. 10.211.160.64
  3. 10.211.160.65
  4. 10.211.160.66
  5. 10.211.160.67
  6. 10.211.160.68
  7. 10.211.160.69
  8. 10.211.160.70
  9. 10.211.138.18
  10. 10.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
  2. while 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"
  13. done < serverinfo.list

2、serverinfo.list主机信息文件

  1. [root@361way auto]# cat serverinfo.list #IP,username,userpassword
  2. 10.144.229.181,admin,admin@test
  3. 10.144.229.182,root,root123

三、总结

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

 
原文地址:https://www.cnblogs.com/yaoyangding/p/15148786.html