DevOps-Automation with Python 16
Website Monitoring 3: Restart Application and Reboot Server(paramiko library ssh client)
前面透過Python程式偵測到網站連線不通,並得到通知
而進一步我們會希望可以有自動修復網站的自動化程式接著運行
最終修正網站(其實概念就像K8S的Self-Healing)
以我們的案例就是嘗試重啟docker container
當然實際真實案例可能不一定是docker指定就能搞定
有可能是任何其他指令才能修正問題
這邊就是一個簡單範例重啟方式修正docker container架設的網站
而這邊就需要Python透過SSH去到機台內操作docker指令
會需要用到Python Library →Paramiko
Paramiko:
- Python implementation of SSHv2
- library for making ssh connections (client or server)
首先就要先來pip安裝
#如果沒有安裝的話:
pip install paramiko
可以直接匯入使用:
基礎寫法如下:
看到參數:
如前面有教過的,如果沒照著顯示的參數順序,就要給參數的key
所以可以這樣輸入
接著可以是密碼或是SSH的private key,這邊就是:
接著比較特別是執行:
當把滑鼠移到上面紅色底線的時候會看到:
意思就是回傳值是分成三個組成,所以可以改寫為如下構造
接著還有個問題是第一次SSH連線會出現的yes/no加入knowshost檔案
這個在Python程式就需要額外增加一行:
這邊再微調:
接著執行我發現在取得網站response的時候就會往Exception跳
所以如上調整並把寄信部分都註解後,執行才看到:
最後要注意補上的是關閉連線:
上面確認ssh連線到機台上執行docker ps成功
所以我們可以簡單的修正nginx container改為如下:
不過講師的程式還是很怪,只是關container,但是可以跑到else的邏輯去
而不是直奔Exception
接著考量到機台本身也掛掉
所以變成容器重啟前還要加上機台重啟!!
這時候就會另外需要linode的Python相關操作使用的Library →linode_api4
到pypi網站上查找:
找到:
先進行安裝:
接著程式可能會寫在Exception的部分,基本寫法如下:
這時候會需要linode的API :
拿到Token:
基本上是要放到如講師的Code裡面:
而這邊就是要放到環境變數去
最底下的程式就可以改為:
如上不論是前篇的smtplib或是這邊的linode_api4
相關使用都可以依循以下流程去看如何使用:
1.Library Doc
2.PyCharm Suggestions
3.Google Example
然後就會看到範例操作linode機台的範例語法:
其中讀取linode機台語法在:
如上文件,其中需要target_type與target_id至少這兩個參數
target_id則在:
此時程式寫法為:
嘗試執行看到:
到linode看到:
接著就是怎麼重啟應用,前面有寫到這段程式,但是先把他Function化
最後面except變成:
如上圖內描述的問題,我們要能夠確認linode機台已完成重啟
所以要多個while迴圈確認
但是講師提供一個經驗是,即便Server啟動了
也應該稍微delay一陣子才去嘗試啟動Container
不然這段code還是會有機會失敗
這時候可以引入另一個library →time
改寫成這樣:
上圖大方框可以考慮改為Function形式
最下面呼叫變成:
這邊將原本寄信的部分邏輯也都解開完整化,當前程式碼變成:
注意上面的{中文}框內的內容都要調整,這段Code才能使用
另外也要注入開頭的環境變數
Schedule Monitoring Task
這邊就會希望上面的偵測是自動化並週期性執行的
用以確保整個應用系統的運作狀態
調整以下這整段程式變成Function:
使用前面學過的schedule library
並改呼叫執行上面的Function:
因為我把寄信機制的google Token設定移除了,否則執行應該看到如講師畫面:
後面甚至可以優化如果應用程式啟動完也寄信通知等等
最後程式內容如下(其中會挖掉要調整的URL等資訊):
使用上還要記得開頭使用到的環境變數設定