1

ファブリック内のすべてのサーバー構成をループして、次のようなホスト名を取得しようとしています:

from fabric.api import env, run

def serv_foo():
    env.hosts = ['bla@example.com']

def serv_bar():
    env.hosts = ['bla@example2.com']

def get_all_servers():
    return {(k,v) for k,v in globals().items() if k.startswith("serv_")}

def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        print(env.hosts)
        serv_fptr()
        print(env.hosts)
        hostname = run("hostname")
        print(hostname)

ただし、これは失敗します。

>>> fab get_hostnames

>>> []
>>> ['bla@example.com']
>>> No hosts found. Please specify (single) host string for connection: 

ファブリック内のホストを動的に更新するにはどうすればよいですか?

  • 注 1: デフォルトの呼び出しがfab serv_foo get_hostnames. それには興味がありません。
  • 注2:execute(serv_fptr)同じ問題が発生します。
4

1 に答える 1

1

executerunを使用して、コマンドのホストを設定する必要があります。

from fabric.api import env, run
from fabric.tasks import execute


def serv_foo():
    return ['bla@example.com']


def serv_bar():
    return ['bla@example2.com']


def get_all_servers():
    return {(k, v) for k, v in globals().items() if k.startswith("serv_")}


def get_hostname():
    return run("hostname")


def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        print(env.hosts)
        hostname = execute(get_hostname, hosts=serv_fptr())
        print(hostname)

または設定コンテキストマネージャー:

from fabric.api import run
from fabric.context_managers import settings


def serv_foo():
    return 'bla@example.com'


def serv_bar():
    return 'bla@example2.com'


def get_all_servers():
    return {(k, v) for k, v in globals().items() if k.startswith("serv_")}


def get_hostnames():
    for serv_name, serv_fptr in get_all_servers():
        with settings(host_string=serv_fptr()):
            hostname = run("hostname")
            print(hostname)

それが役立つことを願っています。

于 2013-06-03T23:48:53.940 に答える