我正在尝试遍历Fabric中的所有服务器配置并获取其主机名:
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:
如何动态更新结构中的主机?
fab serv_foo get_hostnames
。对此不感兴趣。execute(serv_fptr)
会出现同样的问题。答案 0 :(得分:1)
您应该使用execute:
为run
命令设置主机
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)
或settings上下文管理员:
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)
希望有所帮助。