5

Fabric の env.hosts 文字列を変数として渡すことは機能しません。

デモ.py

#!/usr/bin/env python

from fabric.api import env, run

def deploy(hosts, command):
    print hosts
    env.hosts = hosts
    run(command)

main.py

#!/usr/bin/env python

from demo import deploy

hosts = ['localhost']
command = 'hostname'
deploy(hosts, command)

python main.py

['localhost']
No hosts found. Please specify (single) host string for connection:

しかし env.host_string は機能します!

デモ.py

#!/usr/bin/env python

from fabric.api import env, run

def deploy(host, command):
  print host
  env.host_string = host
  run(command)

main.py

#!/usr/bin/env python

from demo import deploy

host = 'localhost'
command = 'hostname'
deploy(host, command)

python main.py

localhost
[localhost] run: hostname
[localhost] out: heydevops-workspace

しかし、env.host_string だけでは十分ではありません。単一のホストです。ループ内で env.host_string を使用できるかもしれませんが、それは良くありません。同時実行タスク数も設定して並列実行したいからです。

現在、ddep (私のデプロイメント エンジン) では、MySQLdb のみを使用してパラメーターを取得し、次のような fab コマンドを実行します。

os.system("fab -f service/%s.py -H %s -P -z %s %s" % (project,host,number,task))

これは簡単な方法ですが、良くありません。fab コマンドを使用すると、失敗したホストを ddep で「再試行」できるようにするために、Python で結果の例外と失敗をキャッチできないためです。「from demo import deploy」を使用すると、Python のいくつかのコードでそれらを制御および取得できます。

したがって、「 env.host 」が問題になります。誰かが私に解決策を教えてもらえますか? どうもありがとう。

4

2 に答える 2

6

これが私の洞察です。

docsによると、python スクリプトからファブリック タスクを呼び出す場合は、fabric.tasks.executeを使用する必要があります。

次のようになります。

  • デモ.py

    from fabric.api import run
    from fabric.tasks import execute
    
    
    def deploy(hosts, command):
        execute(execute_deploy, command=command, hosts=hosts)
    
    
    def execute_deploy(command):
        run(command)
    
  • main.py

    from demo import deploy
    
    hosts = ['localhost']
    command = 'hostname'
    
    deploy(hosts, command)
    

次に、実行するだけpython main.pyです。それが役立つことを願っています。

于 2013-04-25T09:27:12.573 に答える
2

最後に、execute() と exec を使用してこの問題を修正しました。

main.py

#!/usr/bin/env python

from demo import FabricSupport

hosts = ['localhost']

myfab = FabricSupport()
myfab.execute("df",hosts)

デモ.py

#!/usr/bin/env python

from fabric.api import env, run, execute

class FabricSupport:
    def __init__(self):
        pass

    def hostname(self):
        run("hostname")

    def df(self):
        run("df -h")

    def execute(self,task,hosts):
        get_task = "task = self.%s" % task
        exec get_task
        execute(task,hosts=hosts)

python main.py

[localhost] Executing task 'hostname'
[localhost] run: hostname
[localhost] out: heydevops-workspace
于 2013-04-25T09:58:56.580 に答える