例:Apache2を起動
fabric.py
from fabric.api import env, sudo
def servers():
env.hosts = ["b13t.net"]
def startd():
sudo("service apache2 start")
とか書いて,shellで
$ fab servers startd
とかすると,
[b13t.net] Executing task 'startd'
[b13t.net] sudo: service apache2 start
[b13t.net] out: * Starting web server apache2
[b13t.net] out: httpd (pid 20130618) already running
[b13t.net] out: ...done.
[b13t.net] out:
Done.
Disconnecting from b13t.net:65537... done.
などとドヤ顔されますが,実際にsshで入ってps axしてもapache2は居ないしservice apache2 stateしてもNot runningとか言われてこの世の絶望を味わうわけです.
じゃあ絶望を振り払うにはどうすればいいのかというと
def startd():
sudo("service apache2 start", pty=False)
と,pty=Falseを書けば絶望せずに幸せになる訳です.
ぼくは英語が読めないのでよくわかりませんが,
http://stackoverflow.com/questions/6379484/fabric-appears-to-start-apache2-but-doesnt
http://docs.fabfile.org/en/1.6/api/core/operations.html#fabric.operations.run
ここを読むと,pty=Trueの時の仮想端末がなにか情報を漏らしてしまっているのでしょうか.
事前にfabtoolsをpip installとかしてenv.userに十分な権限を与えられたuserを指定してあれば,以下でも起動するようです.(未検証)
from fabtools import service
def startd():
service.start("apache2")