Djangoビューからトリガーされた単純なタスクを実行しています:
task = mock_deploy.delay()
mock_deploy は次のように定義されます。
from celery.decorators import task as ctask
from project.fabscripts.task.mock import *
@ctask(name="mock_deploy")
def mock_deploy():
print "hi form celery task b4 mockdeploy 1234"
output = execute(mock_deploy2)
return "out: %s" % (output)
また、ファブリック タスク自体は次のように定義されます。
@task
def mock_deploy2():
lrun("ls -l /")
lrun("ifconfig eth0")
# i need to get the full output from those commands and save them to db
そして今...私はstdoutを代用しようとしていて、ファブリック実行関数を上書きしていました:
def execute(task):
output = StringIO()
error = StringIO()
sys.stdout = output
sys.stderr = error
task()
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
return (output.getvalue(), error.getvalue())
そして、ファブリックタスク内でstdoutを代用しようとしていました. 私が何をしたとしても、得られた唯一の出力は「ファブリックがやりたいこと」の最初の行でした
out: [localhost] local: ls -l /
次に、ls コマンドの出力全体がセロリ ログに完全に出力されました。out: [localhost] local: ls -l / `9the one I managed to get as output) の 1 行が欠落していることを除いて)
[2012-06-14 21:33:56,587: DEBUG/MainProcess] TaskPool: Apply <function execute_and_trace at 0x36710c8> (args:('mock_deploy', '2a90d920-130a-4942-829b-87f4d5ebe80f', [], {}) kwargs:{'hostname': 's16079364', 'request': {'retries': 0, 'task': 'mock_deploy', 'utc': False, 'loglevel': 10, 'delivery_info': {'routing_key': u'celery', 'exchange': u'celery'}, 'args': [], 'expires': None, 'is_eager': False, 'eta': None, 'hostname': 's16079364', 'kwargs': {}, 'logfile': None, 'id': '2a90d920-130a-4942-829b-87f4d5ebe80f'}})
[2012-06-14 21:33:56,591: DEBUG/MainProcess] Task accepted: mock_deploy[2a90d920-130a-4942-829b-87f4d5ebe80f] pid:22214
hi form celery task b4 mockdeploy 1234
total 3231728
-rw-r--r-- 1 root root 3305551148 2012-06-13 14:43 dumpling.sql
drwxr-xr-x 2 root root 4096 2012-05-09 17:42 bin
drwxr-xr-x 4 root root 4096 2012-02-14 15:21 boot
drwxr-xr-x 2 root root 4096 2012-03-09 14:10 build
drwxr-xr-x 2 root root 4096 2010-05-11 19:58 cdrom
-rw------- 1 root root 2174976 2012-05-23 11:23 core
drwxr-xr-x 15 root root 4080 2012-06-11 12:55 dev
drwxr-xr-x 135 root root 12288 2012-06-14 21:15 etc
drwxr-xr-x 6 root root 77 2012-05-21 14:41 home
...
恐ろしい恐ろしい回避策は、各コマンドに "> /tmp/logfile.log" を追加するファブリック実行コマンドをラップすることです。タスクが終了したら、scp でファイルを取得します...
私の質問は、セロリでトリガーされたときにファブリックタスクの完全な出力を取得するにはどうすればよいですか?
以下はトリックを行いました:
@ctask(name="mock_deploy")
def mock_deploy():
env.roledefs.update({'remote': ['root@1.1.1.1',]})
output = StringIO()
sys.stdout = output
execute(mock_deploy2)
sys.stdout = sys.__stdout__
return output.getvalue()