织物环境角色不按预期行事

2024-06-13 11:21:32 发布

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

fabric website上,给出了以下示例:

from fabric.api import env

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

从文档中可以看出,当在主机www1、www2和ww3上执行时,这个设置应该给env dict键“foo”一个值“bar”。我无法得到这种行为,尽管fabric确实正确地确定了主机。fabfile示例:

^{pr2}$

示例命令:

fab set_role print_foo

意外输出:

[www1] Executing task 'print_foo'
WRONG
[www2] Executing task 'print_foo'
WRONG
[www3] Executing task 'print_foo'
WRONG

Done.

我是不是误解了这个目的?我怎样才能让一个服务器看到一个密钥的不同值,而另一个服务器却没有太多麻烦呢?在

我使用的是fabric 1.10.0


Tags: 服务器env示例taskfoobarwebsitefabric
3条回答

只是一个答案:

env.roledefs = {
    'prod': {
        'hosts':['server1','server2'],
        'path':'/opt/prod'
        },
    'stag': {
        'hosts':['server3','server4'],
        'path':'/opt/stag'
        }
}

@roles('prod')
def runa():
    role = env.effective_roles[0]
    print env.roledefs[role]['path']

我也被这个弄糊涂了。事实证明,在Fabric 1.11中可以访问: https://github.com/fabric/fabric/issues/1276

有两个问题,首先使用的fabric版本比基于字典的定义旧,因此它将密钥解释为主机名。可以通过升级到>;=fabric 1.10.0来解决此问题。第二,这里定义的设置不会自动填充env,但是如果您使用任务来设置角色,则可以这样设置:

@task
def set_role(role_name):
    env.roles.append(role_name)
    for k, v in env.roledefs[role_name].iteritems():
        if k == 'hosts':
            continue
        env[k] = v

调用方式:

^{pr2}$

相关问题 更多 >