/var/log/study

つまり雑記

python fabric2 の話

先日、おもむろに pipenv install fabric したら、fabricのver 2が落ちてきた。

今までのfabricのインターフェースとは大きく変わっていたのでざっくりとまとめておく。

TL;DL

  • fabric2は良い
    • oopなインターフェースを備えた
    • 1ライブラリというスタンスが明確になった
  • fabric1のユーザーは http://docs.fabfile.org/en/2.1/upgrading.html に目を通しましょう。
    • デグレっぽいときはだいたい機能を削った理由が書いてある

Fabric

  • 自動化のためのツール
  • ShellScriptでは微妙だけど、Ansibleを持ち出すほどでもないときによく使われる印象

公式ドキュメント

どのような意図なのか?はわからないが、公式ドキュメントは2ドメインある

また2018年6月16日の段階では fabricの日本語ドキュメントは2対応していないので注意

Fabric ver 2 ?

  • fabric
    • もともとあったfabric
    • python3は未対応
    • 今となってはバージョン指定をして pip インストールをする必要がある
  • fabric 2
    • 先日リリースされたやつ
    • もともとあったfabricのインターフェースを洗練させたため、fabricとは互換性がない
    • python3対応
    • pipenv install fabric で落ちてくる
  • fabric 3
    • fabricが長い間 python3 に未対応だったためのfork
    • fabric の ver 1のインターフェースと ほぼ 互換性がある
      • コードを読むとわかるけど、一部非互換のところもあったよ
    • python3対応
    • pipenv install fabric3 で落ちてくる

ver 1 と ver 2 のgetting start 的な比較

すごく雑だが、パスワード認証でログインできるサーバーにrootで hello world を出力するサンプル

ver 1

from fabric.api import run, env

env.hosts = ["192.168.0.1"]
env.user = "root"

def hello():
    run("echo hello world")

fabfile.pyのあるディレクトリで fab hello で実行可能

ver 2 を ver 1っぽい書き方で

from invoke import task

@task
def hello(c):
    c.run("echo hello world")

fabfile.pyのあるディレクトリで fab --host root@192.168.0.1 --prompt-for-login-password hello

ver 2 を ver 2っぽい書き方で

from fabric import Connection
c = Connection(host="192.168.0.1", user="root", connect_kwargs={"password": "xxxxxxx"})
c.run("echo hello world")

何が変わったのか?

  • ver 1
    • fab コマンドがメイン
    • fabfile.py で、関数の中に fabric.api.run を書いて、 fab 関数名
    • 改めて考えると、マジックな感じが多く、fabricに対する知識が求められる感じ
  • ver 2
    • fab コマンドは使えるが、 invoke の機能を拡張した形
    • fabric.Connection.run を使えばよく、標準のpythonスクリプトとして実行可能
    • API的に、OOP的な感じで、直感的にわかりやすいインターフェースになった

fabricの1と2では、機能的側面で互換性があるので、fabric 1の利用者は http://docs.fabfile.org/en/2.1/upgrading.html を読むことをおすすめする。自分が気になった非互換は以下

fabric ver 1 と ver 2での非互換

http://docs.fabfile.org/en/2.1/upgrading.html からの抜粋して雑に意訳とその感想

  • role がなくなった
    • Group がいい感じで使えるようになったからそっちで賄えそう
  • --shellenv.shell で シェルを指定できなくなった
    • fabric1のときはいろいろと指定する方法があったが面倒なので詳しくは調べていない
    • fabric2では http://www.fabfile.org/upgrading.html#run にremoteでの実行のことが書いてある
    • remoteに対しては runメソッドの引数などを利用せず、commandで明示的に指定するようにしてほしい感じだと思う
  • ディレクトリごとファイルを送れなくなった
    • http://www.fabfile.org/upgrading.html#file-transfer の一番下に書いてある
    • rsync + zip or tar みたいなコードをメンテするのが大変だったからやめたとのこと
    • 自分はローカルでzipにして、リモートに送ってunzipするようにした

雑な感想

fabric ver 2では直感的にわかりやすいし、個人的には良いと思えるインターフェース設計になった印象があるので、積極的にfabric1から移行したい。