はい、Python界隈のレアキャラです。 ついに出るでるといってなかなかでなかったFabric2がでたのでかるくまとめます。
TL;DR
- メジャーバージョンアップだけあってインターフェースがだいぶ変わった
- invokeベースで書くことができる
- 単純なタスクならFabric1からの置き換えはそこまで難しくなさそう。複雑なやつはどうなんだろ、もう少し調べる
object | detail |
---|---|
chage date | 2018/5/12 |
version | fabic 2.0.0 |
os | ubuntu 18.04 |
python | 3.6.5 |
fabric2はPython2.7/Python3.4+でうごく
pypi
https://pypi.org/project/fabric2/
document
install
$ pip install fabric2 # fabric2を指定する $ pip freeze asn1crypto==0.24.0 bcrypt==3.1.4 cffi==1.11.5 cryptography==2.2.2 fabric2==2.0.0 idna==2.6 invoke==1.0.0 paramiko==2.4.1 pyasn1==0.4.2 pycparser==2.18 PyNaCl==1.2.1 six==1.11.0
Python3でインストールするとエラーがでる
https://github.com/fabric/fabric/issues/1740 どうやらwheelの作り方のもんだいっぽい
upgrade 1.x to 2.x
http://docs.fabfile.org/en/latest/upgrading.html
実行コマンド変更
pip install fabric
でいれると fab
コマンドで
pip install fabric2
でいれると fab2
ここでは fab2
で統一する
Installing — Fabric documentation
Fabric1のスクリプトそのままではうごかない
from fabric.api import local def hello(): local("uname -s")
$ fab2 hello fab2 hello Traceback (most recent call last): File "/home/masahito/python-env/fabric2/bin/fab2", line 11, in <module> load_entry_point('fabric2==2.0.0', 'console_scripts', 'fab2')() File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 321, in run self.parse_collection() File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 399, in parse_collection self.load_collection() File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/fabric2/main.py", line 74, in load_collection super(Fab, self).load_collection() File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/program.py", line 588, in load_collection module, parent = loader.load(coll_name) File "/home/masahito/python-env/fabric2/lib/python3.6/site-packages/invoke/loader.py", line 75, in load module = imp.load_module(name, fd, path, desc) File "/home/masahito/python-env/fabric2/lib/python3.6/imp.py", line 235, in load_module return load_source(name, filename, file) File "/home/masahito/python-env/fabric2/lib/python3.6/imp.py", line 172, in load_source module = _load(spec) File "<frozen importlib._bootstrap>", line 684, in _load File "<frozen importlib._bootstrap>", line 665, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 678, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/home/masahito/src/python/try-fabric2/fabfile.py", line 1, in <module> from fabric.api import local, run, put ModuleNotFoundError: No module named 'fabric'
こんな感じでかくと fab2
でうごく
$ cat fabfile.py from invoke import task @task def hello(c): c.run("uname -s")
$ fab2 hello Linux
invoke
だと tasks.py
に書くのだけど、これを fabfile.py
に名前をかえて fab2
から呼ぶことで ssh経由で呼べるようになる
fab2 -H 192.168.0.1 hello
ってやると
ssh経由で helloを実行することが可能
sudoするところはまた明日以降で