2

我有一个看起来像这样的环境:

env.roledefs = {
    'cisco-collectors': ['hosta', 'hostb', 'hostc'],
    'brocade-collectors': ['hosta', 'hostd']
}

我有一些特定的文件需要发送到特定角色的主机:

files = {
    'cisco-collectors': ['/path/to/filea', '/path/to/fileb'],
    'brocade-collectors': ['/path/to/filec', '/path/to/filed']
}

如何编写我的 sendFiles() 函数,以便在命令行上指定角色时,甚至使用@roles()装饰器时,我将能够获得正确的文件列表?

这个问题显示了一种确定主机是否属于某个角色的方法,但我需要获取当前正在执行的角色,以便我知道要发送哪个文件列表。

理想情况下,它看起来像这样:

@roles('cisco-collectors', 'brocade-collectors')    
def sendFiles():
  for file in files[env.current_role]:
    put(file)
4

2 回答 2

1

env.host_string.rolefabric包含最新源中的当前角色(未发布)。

提交

于 2013-01-22T23:51:42.637 回答
0

在我的测试中,我认为您无法可靠地获得 1.5 中的当前角色。请参阅 Pavel 关于这将如何改变的回答。虽然这看起来不方便,但我认为原因是 Fabric 结合了主机列表,因此角色不会延续。

不过,如果您不需要使用角色功能,则有一种解决方法。您可以创建一个更改主机列表的任务。但这适用于一个角色!

from fabric.api import task, local, env

@task
def role1():
    env.current_role = 'role1'
    env.hosts.extend(['example.com'])

@task
def role2():
    env.current_role = 'role2'
    env.hosts.extend(['test.example.com'])

@task
def test():
    print env.current_role
    print env.hosts

如果您现在运行fab role1 test,您将看到:

[localhost] Executing task 'test'
role1
['localhost', 'example.com']
[example.com] Executing task 'test'
role1
['localhost', 'example.com']

不完全是您所追求的……但可能会帮助您找到可行的方法。

于 2013-01-22T23:59:51.137 回答