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ドメインある
- ざっくりした概要が書いてある場所
- APIのドキュメント
また2018年6月16日の段階では fabricの日本語ドキュメントは2対応していないので注意
Fabric ver 2 ?
- fabric
- もともとあったfabric
- python3は未対応
- 今となってはバージョン指定をして pip インストールをする必要がある
- fabric 2
- 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
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 がいい感じで使えるようになったからそっちで賄えそう
--shell
やenv.shell
で シェルを指定できなくなった- fabric1のときはいろいろと指定する方法があったが面倒なので詳しくは調べていない
- fabric2では http://www.fabfile.org/upgrading.html#run にremoteでの実行のことが書いてある
- google先生に翻訳してももらうと
- 指定できるのは嬉しいけど、コマンドのエスケープがバグりがち?
- runの引数にshellはあるけど、他のインターフェース(invoke.runners.Runner)のサブクラスだからあるだけで何もしないとのこと
- たぶんココらへんにそのコードがある https://github.com/fabric/fabric/blob/2.0/fabric/runners.py#L18
- google先生に翻訳してももらうと
- remoteに対しては runメソッドの引数などを利用せず、commandで明示的に指定するようにしてほしい感じだと思う
- ディレクトリごとファイルを送れなくなった
- http://www.fabfile.org/upgrading.html#file-transfer の一番下に書いてある
- rsync + zip or tar みたいなコードをメンテするのが大変だったからやめたとのこと
- 自分はローカルでzipにして、リモートに送ってunzipするようにした
雑な感想
fabric ver 2では直感的にわかりやすいし、個人的には良いと思えるインターフェース設計になった印象があるので、積極的にfabric1から移行したい。