与this question类似,我一直在尝试访问Fabric提供的env.roledefs中的其他密钥:
from fabric.api import env
env.roledefs = {
'web': {
'hosts': ['www1', 'www2', 'www3'],
'foo': 'bar'
},
'dns': {
'hosts': ['ns1', 'ns2'],
'foo': 'baz'
}
}
但是the documentation并没有解释如何访问那些“foo”#39;键。通过以下方式访问它们似乎非常hacky:
env.roledefs[env.effective_roles[0]]['foo']
是否有一种简单的方法可以访问Fabric提供的这些额外密钥?
答案 0 :(得分:0)
Fabric应该在env上调用它,你可以参考:env.foo
;在任何具有此功能的roledef中。
答案 1 :(得分:0)
从1.11.1开始,面料没有提供更简单的方法(并且看到related issue #1276已经关闭,这可能不会改变)。
如果您希望在env
中为给定任务自动设置这些额外的键,您可以使用装饰器。这是我正在使用的那个:
from functools import wraps
def apply_role(f):
"Decorator to apply keys in effective roledef to current env."
@wraps(f)
def wrapper(*args, **kwargs):
if env.effective_roles:
for k, v in env.roledefs[env.effective_roles[0]].items():
if k in env and isinstance(env[k], list) and isinstance(v, list):
env[k].extend(v)
elif k in env and isinstance(env[k], list):
env[k].append(v)
else:
env[k] = v
return f(*args, **kwargs)
return wrapper
然后装饰要为其应用roledef键的任何任务:
@apply_role
def mytask():
...