Python
fabric

Fabricタスクの途中で実行ユーザーを切り替えたいときはsettingsコンテキストマネージャ

More than 5 years have passed since last update.


一つのタスクの中で実行ユーザーを切り替えたい

fabric.api.settingsというコンテキストマネージャを使うと所定のタスクの途中で実行ユーザーを切り替えながら作業ができる。

例えば、


  1. githubからpull -- wwwユーザーで作業

  2. 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",
):

こういうコードを書くと


  1. cuisineのsudo/通常モード切り替えを最初に実行。

  2. envのユーザー・公開鍵をwww, ./fixtures/id_rsaと設定

という風に動く。


感想

もっと早くこの仕様に気づいていればよかった。

無駄にユーザースイッチ用デコレータを自前で書いたりしていたので。