首頁 > 軟體

使用Python Fabric通過SSH進行部署自動化:它是如何運作的

2021-04-22 08:41:26

項目部署的最基本方式之一是將 SSHing 部署到遠端主機中,然後執行一些基本命令。除了部署,這對於在遠端主機上運行任何您想要的命令也很有用,例如當觸發CI/CD管道時。在本文中,我將瞭解如何使用Python Fabric通過Gitlab CI將基本項目部署到遠端伺服器。

什麼是Fabric?

它與Python 2和3相容。要將其與Python3一起使用,請使用以下方式安裝:

pip3 install fabric

由於這裡的最終目標是在自動部署管道中使用,因此實際上不需要在本地機器上安裝(除非管道運行的地方)。

安裝完還需要安裝

fab

二進位制存根,這實質上允許讀取和執行在稱為fabfile的檔案中定義的命令。

創建fabfile

創建一個名為

fabfile.py

的檔案,然後從以下程式碼開始:

from fabric import task@taskdef deploy(ctx): print("Inside the task!")

這定義了一個名為「 deploy」的任務,該任務可以作為參數傳遞給fab二進位制檔案以執行。 @task裝飾器(這是閉包的Python等效物-一個將另一個子例程作為參數或返回另一個子例程的子例程。)用於將deploy函數轉換為可由fab二進位制檔案執行的任務。 該函數必須帶有上下文參數,在這種情況下,該參數以ctx的形式給出。

通過運行fab執行此操作時,請從與fabfile.py相同的目錄中部署,「在任務中!」 將被列印為輸出。

現在用這個來做Fabric的意圖-連線遠端主機並執行其中的命令。

from fabric import Connection, task@taskdef deploy(ctx): with Connection("HOST") as c: with c.cd("/home/project/path/"): c.run("docker-compose down") c.run("git pull origin master --recurse-submodules --rebase") c.run("docker-compose up --build -d")

在這裡,將

HOST

替換為要建立連線的主機的名稱或IP地址。從那裡,可以執行登入的使用者有權執行的任何命令。

c.cd()

用於確保從該特定資料夾執行其餘命令。在此之後,我用

c.run()

給出的命令只是例子。用你需要執行的東西替換它們。

connect_kwargs

參數將參數傳遞給Paramiko的

SSHclient.connect

方法。這看起來像:

from fabric import Connection, task@taskdef deploy(ctx): with Connection( "HOST", user="USERNAME", connect_kwargs={"key_filename": "~/.ssh/your_key"} ) as c: with c.cd("/home/project/path/"): c.run("docker-compose down") c.run("git pull origin master --recurse-submodules --rebase") c.run("docker-compose up --build -d")

Paramiko的

SSHclient.connect

採用

key_filename

參數,該參數指定要使用的金鑰的檔名。現在,正在通過SSH傳遞建立連線所需的所有資訊。

當然,將這些都載入為環境變數要安全得多。使用Gitlab CI時,在設定環境變數時,可以選擇將金鑰作為檔案而不是字元串可用,這是使其與

key_filename

參數配合使用所必需的。

這是Gitlab CI/CD設定下的變數部分的螢幕截圖,主機名作為字元串新增,金鑰作為檔案新增。

設定Gitlab CI

現在fabfile已經準備就緒,我們所要做的就是使用Python Fabric包執行它。這可以以想要的任何方式完成 - 手動、使用 Github 操作等。

Fabric比這裡概述的選項要多得多,例如處理在需要時將sudo密碼傳送到遠端主機,處理多個主機等。

總之,這是一種非常簡單有效的方法,以程式設計方式構建指令碼,通過SSH執行,並通過通用方法(例如CI/CD工具)使用。

好了,本文到此結束。如果對程式設計、計算機、程式設計師方面感興趣的話,歡迎私信聯絡我,隨時交流!點個關注,是對我莫大的鼓勵!


IT145.com E-mail:sddin#qq.com