19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2013-03-18

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

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と設定

という風に動く。

感想

もっと早くこの仕様に気づいていればよかった。
無駄にユーザースイッチ用デコレータを自前で書いたりしていたので。

19
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?