1.介紹
Fabric 是一個高級 Python (2.7,3.4 +)庫,旨在通過 SSH 遠程執行 shell 命令,從而產生有用的 Python 對象。 它構建在 Invoke (子流程命令執行和命令行特性)和 Paramiko (SSH 協議實現)之上,擴展它們的 api 以相互補充並提供額外的功能。
Fabric 最基本的用途是通過 SSH 在遠程系統上執行 shell 命令,然後(可選)查詢結果。 默認情況下,遠程程序的輸出直接打印到終端,並被捕獲。
2.安裝
pip install fabric==1.14.0 (python2)
pip install fabric3 (python3)
3.簡單示例:fabfile.py
#!/usr/bin/env python
# coding=utf-8
from fabric.api import *
from fabric.context_managers import *
__author__ = 'jing'
"""
一個自動部署樣例,主要過程是
1.進入項目目錄
2.拉取最新代碼
3.殺掉對應端口的進程
4.啓動服務
5.查看狀態
"""
# 項目配置,可以不參照我的
# 項目目錄
PROJECT_PATH = '/data/project/my_project/'
# 項目名稱,用於ps -ef時查詢
PROJECT_NAME = "my_project"
# 端口
PROJECT_PORT = 5133
# git 分支,由於我配置了ssh 鏈接,所以可以直接拉取代碼
GIT_BRANCH = 'master'
# 服務器配置,名稱可以隨便取
# 用戶名
USER = 'root'
# 外網ip
HOSTS = ['127.0.0.1']
# 密碼
PASSWORD = 'pwd'
# 重點配置
# fabric的上下文環境配置
env.user = USER
env.hosts = HOSTS
env.password = PASSWORD
# 可以把退出換爲警告,以提供更靈活的錯誤處理。如果設置爲False,則一條命令運行失敗會就會退出,不再執行後面的命令。
env.warn_only = True
# 命令執行超時時間
env.command_timeout = 1800
# 連接超時時間
env.timeout = 3000
# 在連接到新服務器時,Fabric 嘗試連接的次數。 由於向後兼容的原因,它默認只有一次連接嘗試。
env.connection_attempts = 300
def check_user():
# 切換身份
run("sudo -s ", pty=True)
def pull():
# 拉取最新代碼
run('git pull origin %s ' % GIT_BRANCH, pty=False)
def kill_run_procedure():
run("kill $(lsof -i:%s|awk '{if(NR==2)print $2}')" % PROJECT_PORT)
def restart():
# 這裏有一個坑,執行source ../venv3/bin/activate命令 進入虛擬環境時會失敗
# 解決辦法是寫一個shell腳本,執行shell.腳本
# restart.sh
# `source /usr/local/pythonvenv/venv3/bin/activate
# nohup python runserve.py &`
sudo("sh restart.sh")
def show_result():
run('ps -ef|grep %s' % PROJECT_NAME)
def runserver():
# 進入目錄
with cd(PROJECT_PATH):
# 拉取代碼
pull()
kill_run_procedure() # 殺掉正在運行的程序
# 重新啓動
restart()
# 查看結果
show_result()
print('結束')
4.執行命令
在命令行裏執行命令 fab -f [文件名] [方法名]
fab -f fabfile.py runserver