如何在Fabric中使用其他env.roledefs键?

时间:2015-02-12 21:02:16

标签: python fabric

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提供的这些额外密钥?

2 个答案:

答案 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():
    ...