zoukankan      html  css  js  c++  java
  • 利用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模块 + 多线程的方式实现。但如果内网环境,安装一些自动化工具,尤其是依赖包比较多的情况下,比较难搞时,可以试试这些轻量级的玩意。

     
  • 相关阅读:
    素数推断算法(高效率)
    Hibernate的fetch
    TRIZ系列-创新原理-22-变害为利原理
    Offer是否具有法律效力?
    浅谈C++多态性
    C语言scanf函数详解
    大话设计模式之原型模式
    Android源码文件夹结构
    简单的REST的框架实现
    android startActivityForResult的用法
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/15148786.html
Copyright © 2011-2022 走看看