2013-06-03 37 views
1

我想遍历我的所有服务器配置织物,并得到他们的主机像这样:更新主机

from fabric.api import env, run 

def serv_foo(): 
    env.hosts = ['[email protected]'] 

def serv_bar(): 
    env.hosts = ['[email protected]'] 

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 

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

如何动态更新织物中的主机?

  • 注意1:我知道默认调用将是fab serv_foo get_hostnames。对此不感兴趣。
  • 注2:execute(serv_fptr)给出同样的问题。

回答

1

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

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


def serv_foo(): 
    return ['[email protected]'] 


def serv_bar(): 
    return ['[email protected]'] 


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 '[email protected]' 


def serv_bar(): 
    return '[email protected]' 


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) 

希望有所帮助。

+0

第一个答案像魅力一样运行。其次给出了相同的主机问题。随着第一个,也可以一般运行任何功能。谢谢。 – RickyA