Python查看多台伺服器處理序的指令碼分享

來源:互聯網
上載者:User
最近做自己開發用相關服務的一個checklist,就寫了這個指令碼,用來在跳板機去檢查各個伺服器上面的相關服務是否正常

使用expect登入每個機器(因為安全問題,不能直接使用ssh信任),然後根據yaml檔案的配置讀取服務名字以及啟動的進程數量 去檢查每個服務是否正常 PS:痛點是沒有用連接埠轉寄也只有普通使用者權限

checklist.py

代碼如下:


#coding=utf-8
import sys
#因為我這個指令碼要讓很多人能運行,但是不能給他們看見我的密碼演算法,所以是pyc
#我這個指令碼要給很多其他普通使用者去用,是用我的ssh登入操作,不能放在我的home目錄,所以放在tmp
sys.path.append('/tmp/local/lib/python2.6/site-packages/PyYAML-3.10-py2.6-linux-x86_64.egg') #依賴yaml
sys.path.append('/tmp/local/lib/python2.6/site-packages/pexpect-2.4-py2.6.egg') #依賴pexpect
import yaml
import pexpect
dataDict = yaml.load(open('/tmp/config.yaml')) #將我的yaml配置load進來

def myprint(color,mes): #以前寫的一個終端彩色列印的函數
'''使用ANSI控制碼終端顯示彩色'''
d = dict(r=31, g=32, gb=36, y=33, b=34, p=35, o=37)
color = "\x1B[%d;%dm" % (1, d[color])
print "%s%s\x1B[0m" % (color, mes)

def main():
list = ['g', 'b', 'y', 'gb', 'p']
light = 0
for k in dataDict:
if k.startswith('bj-'):
color = list[light%5] #根據伺服器對顏色輪循
SERVER = dataDict[k]
#我這是使用了-F 是因為我沒有root許可權不能修改hosts檔案,但是我在config.yaml使用了別名,
而這個定義就是自訂了sshconfig,預設是~/.ssh/config
child = pexpect.spawn('ssh -F /tmp/sshconfig dongwm@{0}'.format(SERVER['host']))
#因為有其他使用者,可能他還沒有連結過某伺服器,最開始會讓你確認伺服器標識,需要點yes
f = child.expect(['Password: ', 'password: ', 'continue connecting (yes/no)?'])
if f == 2:
#當這個flag為2 表示那個使用者沒有登入過某伺服器
child.sendline('yes')
child.expect('password:')
child.sendline('{0}'.format(mypasswd(SERVER['host']))) #mypasswd是加密我伺服器許可權的函數,每個伺服器密碼不同
if f == 1:
child.sendline('{0}'.format(mypasswd(SERVER['host'])))
child.expect('~')
for service in SERVER['service']:
flag = 0
#我在配置裡面會加服務,一般會指定服務的進程數來對比是否正常
if isinstance(service, dict):
data =service.items()[0]
service = data[0]
num = data[1]
else:
#假如我在配置只指定服務,不指定進程數,那麼只要確定跑了進程 不在乎進程數
num = 0
flag = 1
child.expect('~')
child.sendline('ps -ef|grep {0}|grep -v grep|wc -l'.format(
service))
child.readline()
#進程數
pro_num = child.readline().split('\r\n')[0]
if int(pro_num) == num or flag:
#進程數符合配置標註的數值
myprint(color, '[{0}] [{1}] [{2}] [{3}]'.format(k.center(12),
SERVER['ip'].center(14), service.center(20), 'ok'.center(4)))
else:
myprint('r', '[{0}] [{1}] [{2}] [{3}] [{4}!={5}]'.format(k.center(12),
SERVER['ip'].center(14), service.center(20), 'fail',
pro_num, num))
light += 1
child.sendline('exit')

if __name__ == '__main__':
main()

config.yaml 我這裡只截取了其中一段

代碼如下:


bj-2:
host: s233 #這個s233在sshconfig指定
ip: XXX.XXX.XXX.233 #只是為了顯示出ip 好確認
service: #服務load後是一個列表
#給XX用
- nginx: 5
- uwsgi: 25
- supervisord: 1
#給本機XX提供mysql服務
- mysql: 3 #django
#給本機XX提供XX
- celery: 12
#給本機XX提供XX
- rabbitmq: 9
- redis: 1
- mongod: 2

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.