一、場景概述
剛入職新公司的第3天,接到任務說需要獲取100多台物理伺服器的資訊,其中有:主機名、ip位址、磁碟數量,磁碟裝置編號。悲催的是現有的生產環境沒有任何可用的工具去做這個事情,本想用ansible去搞,但因對ansible還不是很熟悉,因此決定徒手擼乙個指令碼來實現,所以呢才有了此指令碼的誕生。
二、指令碼的基本思路
1、python pexpect模組,用該模組來實現ssh連線
2、連線後在遠端主機跑相關命令
3、返回結果
4、返回的結果隨便你怎麼處理,視覺化也好,分析也好,儲存到資料庫也行
三、**如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/usr/bin/env python
#describe:
# gets the physical hard disk number of each host
#author: tantianran
#email: [email protected]
#time: 2016-10-09 17:28
# -*- coding: utf-8 -*-
import
pexpect
def
ssh_cmd(ip,shell_cmd):
passwd
=
'1qaz#edc'
ssh
=
pexpect.spawn(
'ssh root@%s "%s"'
%
(ip, shell_cmd))
try
:
i
=
ssh.expect([
'password:'
,
'continue connecting (yes/no)?'
], timeout
=
5
)
if
i
=
=
0
:
ssh.sendline(passwd)
elif
i
=
=
1
:
ssh.sendline(
'yes\n'
)
ssh.expect(
'password: '
)
ssh.sendline(passwd)
ssh.expect(
'#'
)
ssh.sendline(shell_cmd)
ssh.expect(
'#'
)
except
pexpect.eof:
data
=
ssh.before
#讀取shell命令執行的結果
ssh.close()
except
pexpect.timeout:
print
"connect timeout..."
ssh.close()
return
data
#返回shell命令執行結果
def
get_host():
cmd
=
'''
name=`hostname`
ip=`ifconfig eth0 | grep inet|grep -v 127.0.0.1|grep -v inet6|awk ''`
disk=`ls -l /dev/vd[a-z] | wc -l`
list=`ls -l /dev/vd[a-z] | awk ''`
echo "hostname:"$name "ip"$ip "disk:"$disk "info:"$list
'''
return
cmd
for
i
in
range
(
165
,
167
):
ipaddr
=
'192.168.122.%s'
%
i
data
=
ssh_cmd(ipaddr,get_host())
print
data
f
=
open
(
'host_info.txt'
,
'a'
)
f.write(data)
四、測試環境說明
在寫這個指令碼的時候,建立了兩台vm用來模擬生產環境的乙個場景。 vm01:192.168.122.165,vm02:192.168.122.166
小試牛刀之webpack dev server
模組熱替換 用express搭建過乙個小型的伺服器,用過監聽模式來解決手動npm run build的麻煩,這次使用webpack dev server來搭建乙個伺服器,且一併解決 手動編譯 手動重新整理瀏覽器 的麻煩。目錄 詳細 root div body html import from mat...
python 演算法 小試牛刀
1.列印從1到100,碰到3倍數用fizz代替,碰到5倍數,用buzz代替,3和5的倍數,fizzbuzz代替 def func for i in range 1,101 if i 3 0 i 5 0 print fizzbuzz elif i 3 0 print fizz elif i 5 0 p...
Python小試牛刀 迴圈
斐波那契數列,數列前兩項為1,之後每一項都是前兩項之和。usr bin env python3 a,b 0,1 while b 100 print b a,b b,a b預設print輸出結果後會自動換行,如果不希望換行,只做間隔的話,就通過另乙個引數end來替換這個換行符 print a,end ...