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: 

如何动态更新结构中的主机?

  • NOTE1:我知道默认调用是fab serv_foo get_hostnames. 对此不感兴趣。
  • NOTE2:execute(serv_fptr)给出了同样的问题。
4

1 回答 1

1

run您应该使用execute为命令设置主机:

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 回答