DevOps-Automation with Python 16

Website Monitoring 3: Restart Application and Reboot Server(paramiko library ssh client)

ZONGRU Li
Nov 15, 2023

前面透過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)
LINK

首先就要先來pip安裝

#如果沒有安裝的話:
pip install paramiko

可以直接匯入使用:

基礎寫法如下:

看到參數:

如前面有教過的,如果沒照著顯示的參數順序,就要給參數的key

所以可以這樣輸入

這個IP位置上完課機台就移除了

接著可以是密碼或是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

LINK
LINK

然後就會看到範例操作linode機台的範例語法:

其中讀取linode機台語法在:

LINK

如上文件,其中需要target_typetarget_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等資訊):

使用上還要記得開頭使用到的環境變數設定

參考課程reference

--

--

ZONGRU Li

2022/11/17 開源部分個人筆記給LINE "Java程式語言討論區"社群,希望能對社群的技術學習做一點點貢獻.(掩面....記得退訂閱!