在Fabric脚本中更新主机

时间:2013-06-03 12:17:47

标签: python fabric

我正在尝试遍历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: 

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

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

1 个答案:

答案 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)

希望有所帮助。