Fabric の run() メソッドと sudo() メソッド


この記事では、Fabricの主要メソッドである run() と sudo() について解説します。

サンプルコードは https://github.com/shiumachi/fabric-sample にあります。

run() と sudo() の基本


読みやすくするため、以後は必要がない限り run() メソッドのみを取り上げます。run() で出来ることはほぼ全て sudo() でも出来ます。断りが無い限り、run() は sudo() と読み替えることができます。

  • from fabric.api import run でインポート可能
  • run([コマンド文字列]) で、任意のコマンド文字列を実行可能
  • sudo([コマンド文字列]) とすれば、任意のコマンド文字列を sudo できる

エラーハンドリング


run() で実行したコマンドが失敗した場合、fab コマンド自体がその場で中断(abort)されます。

もしそのまま処理を続行したい場合は warn_only=True という引数を追加します。

def run_error_warn_only():
    run("hoge", warn_only=True)


warn_only=True だけだと、処理は続行できますがエラー出力はそのまま行われます。
エラー出力も抑制したい場合は quiet=True を追加します。

def run_error_warn_only_with_quiet():
    run("hoge", warn_only=True, quiet=True)

出力内容やリターンコードを使う


run() コマンドの返り値には、出力内容とリターンコードなどの情報が含まれています。

この返り値、公式ドキュメントでさえ使い方がきちんと整理されて書かれていないので、ここにまとめておきます。

res = run() としたとき、

  • print res
    • 実行したコマンドの出力内容を出力する
  • res.return_code
    • リターンコードを返す
  • res.succeeded
    • コマンドが成功していたら True、失敗していたら False を返す
  • res.failed
    • コマンドが失敗していたら True、成功していたら False を返す。succeeded の逆。


となります。

def succeeded_sample():
    res = run("hostname", warn_only=True)
    if res.succeeded is True:
        puts("succeeded!")
        return

sudo() で、リモートサーバ上で別のユーザとしてコマンドを実行


リモートサーバで、現在実行しているユーザとは別のユーザでコマンドを実行したいときがあります。

例えば、Hadoop HDFS の管理コマンドは hdfs ユーザしか扱えません。

そういうときは、user='ユーザ名' を使います。

def sudo_user_sample():
    print sudo("id", user='sho')


ユーザ名は、既に存在する別のユーザがあればそのユーザと置き換えてください。