如何使用附加环境角色织物上的钥匙?

2024-05-29 01:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

this question相似,我一直试图访问环境角色该面料提供:

from fabric.api import env

env.roledefs = {
    'web': {
        'hosts': ['www1', 'www2', 'www3'],
        'foo': 'bar'
    },
    'dns': {
        'hosts': ['ns1', 'ns2'],
        'foo': 'baz'
    }
}

但是the documentation没有解释如何访问那些'foo'键。必须通过以下方式访问它们,这似乎是一种超级黑客行为:

^{pr2}$

有没有一种简单的方法可以访问Fabric提供的这些额外的密钥?在


Tags: fromimportenvapiweb角色环境foo
2条回答

从1.11.1开始,fabric没有提供更简单的方法(而且看到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键的任务:

^{pr2}$

Fabric应该使它在env上是可调用的,您可以引用它,比如:env.foo;在任何一个在其dict中有这个的roledef上

相关问题 更多 >

    热门问题