Python 自動化工具 Fabric 支持 Python3 了

Python 自動化工具 Fabric 支持 Python3 了

來自專欄 MG的編程小屋24 人贊了文章

0x00 前言

當大家還在糾結 Python2 與 Python3 的時候,我其實早就入了 python3 的門了。

後來

  • ~~我總算學會了如何去愛~~。(知乎就不能支持一下刪除線嘛???)
  • 我喜歡的工具陸陸續續支持了 Python3
  • Scrapy 支持了 Python3
  • Ansible 支持了 Python3

只有 Fabric 這個工具,死撐著沒有支持 Python3 的的跡象。

2018-05-08 的時候,Fabric 悄悄升級了 2.0 版本。

而就在前兩天,我升級網站的時候,突然發現 fabric (1.14 版本) 不能用了。

查了一下版本,發現 fabric 更新到了 2.0 版本,支持了 python3.4

在發現這個問題之後,火速刷了一波官方文檔,把手頭 Fabric 1.14 版本的腳本做了一些升級。

從 V1 到 V2

Fabric v2 基於 invoke 和 paramiko 兩個庫構建而成。

  • invoke 庫提供了 subprocess command execution 和 command-line
  • paramiko 提供了 ssh 協議實現

在這兩者的基礎上,做了一些擴展。

甚至,如果你只用其中的本地功能,你都完全不需要使用 fabric, 直接用 invoke 即可。沒錯,我已經打算把我的本地腳本全部使用 invoke Python3 化了。

v1 版本和 v2 版本初步用起來,個人覺得 v1 用起來 API 更加符合直覺一些。

這東西怎麼用呢?

我們先定義 fabfile

# fabfile.pyfrom invoke import taskdef expand_path(c, path): return "$(echo %s)" % pathdef exists(c, path): cmd = stat %s % expand_path(c, path) return c.run(cmd, warn=True, hide=True).ok@taskdef deploy(c): c.local("youcmd") c.put() c.get() c.run() c.run("sudo youcmd") ......@taskdef other_stuff(c): ......

需要注意的是,invoke 裡面默認的 replace_env 設置為了 False ,fabric 裡面給 runner 設置了 replace_env 為 True , 這也就意味著默認情況下,執行 c.local 的時候會找不到自定義的環境變數,這意味著:

  1. 你的 PATH 被重置了,這意味著你用 brew 安裝的軟體可能已經完全找不到了。
  2. 你的環境變數 LANG 並不一定是 en_US.UTF-8 了

於是設置一下。

# ~/.fabric.py#!/usr/bin/env python# encoding: utf-8run = { "replace_env": False}

當我要部署的時候直接執行

fab -H webserver01,webserver02,webserver03,webserver04 deploy

到這裡大家基本上看出來了,我並沒有在文件中 import fabric 只是簡單了配置了一個配置文件和執行一下 fab 命令。

這個 v2 版本的 fabric 相當於 invoke 的包裝。但我們也可以顯式的 import fabric 裡面的東西進行更加進階的操作。

更多內容還是要多刷刷官方文檔


推薦閱讀:

數據科學從業人員如何選擇 python IDE
有沒有夫妻相?刷一下臉就知道!
Py列為黑客應該學的四種編程語言之一初學者該怎麼學
如何看待大V董偉明愛湃森學院退學事件(事件已解決)?

TAG:Python | 編程 | 編程語言 |