一つのタスクの中で実行ユーザーを切り替えたい
fabric.api.settingsというコンテキストマネージャを使うと所定のタスクの途中で実行ユーザーを切り替えながら作業ができる。
例えば、
- githubからpull -- wwwユーザーで作業
- nginx, supervisord再起動 -- adminユーザーで作業
このようなタスクを作りたいときは以下のコードを書けば良い。
operationwithswitchinguser.py
from fabric.api as fb
import cuisine as cs
def refresh(branch="origin/master", restart="yes"):
with fb.settings(
cs.mode_user(),
user="www",
secretkey="./fixtures/id_rsa",
):
with fb.cd("/home/www/repo"):
cs.run("git fetch")
cs.run("git checkout %s" % branch)
if restart == "yes":
with fb.settings(
cs.mode_sudo(),
user="admin",
secretkey="./fixtures/id_rsa",
):
cs.run("/etc/init.d/nginx restart")
cs.run("/etc/init.d/supervisord restart")
settingsコンテキストマネージャについて
settingsコンテキストマネージャは
- 可変長引数(*args のこと) : 他のコンテキストマネージャを引き継ぐ
- キーワード引数(**kwargs のこと): fabric.state.envを一時的に書き換える
このような仕様になっている。
つまり、
with fb.settings(
cs.mode_user(),
user="www",
secretkey="./fixtures/id_rsa",
):
こういうコードを書くと
- cuisineのsudo/通常モード切り替えを最初に実行。
- envのユーザー・公開鍵をwww, ./fixtures/id_rsaと設定
という風に動く。
感想
もっと早くこの仕様に気づいていればよかった。
無駄にユーザースイッチ用デコレータを自前で書いたりしていたので。