Python 远程部署利器 Fabric2 模块
fabric?官網英文文檔:http://www.fabfile.org/
《Python自動化運維技術與最佳實踐》
如何用 Fabric 實現無密碼輸入提示的遠程自動部署:
fabric實現遠程操作和部署:
簡介
Fabric 是一個 Python 的庫,同時它也是一個命令行工具。它提供了豐富的同 SSH 交互的接口,可以用來在本地或遠程機器上自動化、流水化地執行 Shell 命令。使用 fabric 提供的命令行工具,可以很方便地執行應用部署和系統管理等操作。因此它非常適合用來做應用的遠程部署及系統維護。其上手也極其簡單,你需要的只是懂得基本的 Shell 命令。
fabric 依賴于 paramiko 進行 ssh 交互,fabric 的設計思路是通過幾個 API 接口來完成所有的部署,因此 fabric 對系統管理操作進行了簡單的封裝,比如執行命令,上傳文件,并行操作和異常處理等。
paramiko 是一個用于做遠程控制的模塊,使用該模塊可以對遠程服務器進行命令或文件操作,fabric 和 ansible 內部的遠程管理就是使用的 paramiko 來現實。
fabric 簡介 和 各個版本差異比較:http://www.mamicode.com/info-detail-2337088.html
1、Python 官網發布的地址
- Fabric1:https://pypi.org/project/Fabric/
- Fabric2:https://pypi.org/project/fabric2/
- Fabric3:https://pypi.org/project/Fabric3/
2、區別
- 1)Fabric1、Fabric和fabric2:Fabric 和 Fabric2 在 Pypi 中就是同一個東西,fabric2 只是 Fabric 的替代名稱,為了便于使用備用名稱進行安裝。Fabric2 和之前的 Fabric1 相比,完全重寫了,接口和功能都有很大改動,官網也不建議繼續用 Fabric1,建議升級到 Fabric2。‘而最新版也早就支持 Python 3.4+、Python2.7 了。
- 2)Fabric3:Fabric3 是非官網的,是之前使用 Fabric 時,沒有支持 Python3 的版本,有人fork 出來,加了 Python3 的支持,但現在應該已經不維護了。
3、總結
盡量使用最新的 Fabric2。
Fabric 在升級 2.x 之后,幾乎就是重寫了。很多以前的用法都變了,然后在 1.x 時代,本地和遠程都是用一套代碼處理,但是 2.x 的時候將 local 處理部分和遠程處理部分分別拆分為 fab 和 invoke了,拆分的理由可以參考?這里。
忘記 1.x 的一切,然后從頭開始
- http://docs.fabfile.org/en/2.3/getting-started.html
一、fabric2 模塊使用
fabric2 是 python 的一個庫,同時也是命令行工具,使用 fabric2 模塊,可以方便的執行應用部署和系統管理等操作
fabric2 依賴于paramiko 進行 ssh 交互,fabric2 的設計思路是通過幾個 API 接口來完成所有的部署
安裝:pip install fabric2? -i "https://pypi.doubanio.com/simple/"
fabric2? 的簡單使用
from fabric2 import Connectiondef deploy():# 如果服務器配置了ssh免密碼登錄,就不需要 connect_kwargs 來指定密碼conn = Connection("root@192.168.44.13", connect_kwargs={"password": "123456"})conn.run("ls")with conn.cd('/home'):conn.run("mkdir testdir")with conn.cd('/home/testdir'):conn.run('mkdir aaa')conn.put('test', '/home/testdir') # 上傳文件if __name__ == '__main__':deploy()Connection 參數詳解
def __init__(self,host, # 主機 ipuser=None, # 用戶名port=None, # ssh 端口,默認 22config=None, # 登錄配置文件gateway=None, # 連接網關forward_agent=None, # 是否開啟 agent forwardingconnect_timeout=None, # 設置超時connect_kwargs=None, # 設置密碼登錄 connect_kwargs={"password": "123456"}# 還是密鑰登錄 connect_kwargs={"key_filename": "/home/myuser/.ssh/id_rsa"}inline_ssh_env=None,)conn 對象屬性
run # 執行遠程命令,如:run('uname -a') cd # 切換遠程目錄,如:cd('/root'); with conn.cd('/root'),繼承這個狀態 put # 上傳本地文件到遠程主機,如:put('/root/test.py','/root/test.py') get # 獲取服務器上文件,如:get('/root/test.py') sudo # sudo方式執行遠程命令,如: sudo('service docker start') local # 執行本地命令,如:conn.local('ls')二、 fabric2 對多臺機器使用
對多臺機器使用時,Connection?
from fabric2 import Connectionfor host in ('root@192.168.44.20','root@192.168.44.21','root@192.168.44.22'):result = Connection(host,connect_kwargs={'password':'123456'}).run('uname -s')print("{}: {}".format(host,result.stdout.strip()))輸出結果
Linux root@192.168.44.20: Linux Linux root@192.168.44.21: Linux Linux root@192.168.44.22: Linux對多臺機器使用時,SerialGroup
from fabric2 import SerialGrouppool = SerialGroup('root@192.168.44.20','root@192.168.44.21','root@192.168.44.22',connect_kwargs={'password':'123456'}) print(pool) pool.run('uname -s') for conn in pool:conn.run('mkdir testfiles')擴展,運行本地命令
import invokeinvoke.run('ls')三、使用示例:
From:https://www.walkerfree.com/article/183
import getpass from fabric import Connection, task@task def pack(c):# 這里的c參數我理解為是Connection連接的本地 然后根據setup.py進行項目打包c.run('python setup.py release sdist --format=gztar')@task def deploy(c):# 輸入服務器的登錄用戶名user = raw_input('Input login user name: ')# 輸入服務器的登錄地址host = raw_input('Input login host: ')# 輸入服務器的項目目錄地址root = raw_input('Input project root path:')# 輸入服務器的登錄密碼user_pass = getpass.getpass('Input login user pass:')# 獲取包的全名稱result = c.run('python setup.py --fullname', hide=True)dist = result.stdout.strip()filename = '%s.tar.gz' % dist# 獲取包的名稱 - 這個名稱可以根據自己的需求來自定義,這里主要是為了下面supervisor啟動時使用result = c.run('python setup.py --name', hide=True)name = result.stdout.strip()# 遠端服務器連接創建remote = Connection('%s@%s' % (user, host),connect_kwargs={"password": user_pass})# 上傳文件到遠端服務器remote.put('./dist/%s' %filename, remote='%s' % root)# 在遠端服務器上執行下面命令 - 這個會默認輸出你在遠端服務器展示的信息result = remote.run('cd %s &&\source .env/bin/activate &&\ls -al && type python &&\pip install %s &&\supervisorctl restart walkerfree' % (root, filename))使用方式如下:fab pack deploy
這個命令其實也可以分布執行:
fab pack?
fab deploy
Fabric 自升級至2.x后,API大變,fab工具也逐漸邊緣化,其編程方式也與普通的python腳本逐漸趨同。以下是Fabric1.x與2.x大致的差異與變化,用 python 腳本展示:
#!/bin/python # coding:utf-8 from fabric import ThreadingGroup as Group import ConfigParser#fabric2.x不再支持1.x中的from fabric.colors import *方式在終端上輸出有顏色的執行結果 #可以通過導入blessings包的方式來完成相關操作 from blessings import Terminal t = Terminal()def run_command(command_section, connection):for option in cf.options(command_section):#在shell中執行grep命令后,如果沒有相關信息輸出,grep的返回值為0,需要添加warn=True來#避免UnexpectedExit異常的觸發result = connection.run(cf.get(command_section, option), warn=True)if option.find('grep', 0) != -1 and result.stdout == '':print(option + " exec complete!")if __name__ == '__main__':#可以通過額外定義配置文件的方式,實現執行命名與腳本代碼的分離cf = ConfigParser.ConfigParser()cf.read('command.conf')#以Group執行的方式也發生了變化,具體可參考api文檔for aims_connection in Group('aims@10.99.1.24'):#通過紅色加粗下劃線的方式顯示print t.red_underline_bold(str(aims_connection))run_command("common_command", aims_connection)run_command("aims_command", aims_connection)for ib_connection in Group('ibuser@10.99.1.27'):print t.red_underline_bold(str(ib_connection))run_command("common_command", ib_connection)run_command("ib_command", ib_connection)配置文件:
[common_command] df_command = df -h | awk 'NR > 1 && $5+0 > maxspace {maxspace = $5+0;name = $6} END { print name " has " maxspace"%"} '[aims_command] grep_syserror_command = grep -i error /var/log/syslog grep_syswarn_command = grep -i warning /var/log/syslog[ib_command] jboss_warn = grep -i warn /opt/logs/services/jboss.log | grep -v 'null'總結
以上是生活随笔為你收集整理的Python 远程部署利器 Fabric2 模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用 Python 爬虫框架 Scrapy
- 下一篇: 菜鸟教程 之 JavaScript 实例