我的环境有点像这样:
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()
装饰器,我将能够获得正确的文件列表?
This question显示了一种确定主机是否属于某个角色的方法,但我需要获取当前正在执行的角色,以便知道要发送的文件列表。
理想情况下,它看起来像这样:
@roles('cisco-collectors', 'brocade-collectors')
def sendFiles():
for file in files[env.current_role]:
put(file)
答案 0 :(得分:1)
env.host_string.role
包含最新fabric
来源(未发布)中的当前角色。
答案 1 :(得分: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']
不完全是你所追求的......但可能有助于引导你发挥作用。