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 的時候會找不到自定義的環境變數,這意味著:
- 你的 PATH 被重置了,這意味著你用 brew 安裝的軟體可能已經完全找不到了。
- 你的環境變數 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董偉明愛湃森學院退學事件(事件已解決)?