1. 程式人生 > 其它 >利用sshpass獲取多臺主機的資訊

利用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\n" ,$1/$2}')
  6. usedredu_value=$(echo $used_redu $total | awk '{ printf "%0.2f\n" ,$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模組 + 多執行緒的方式實現。但如果內網環境,安裝一些自動化工具,尤其是依賴包比較多的情況下,比較難搞時,可以試試這些輕量級的玩意。