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 」が問題になります。誰かが私に解決策を教えてもらえますか? どうもありがとう。