python - Fabric env.roledefs 未按预期运行

标签 python fabric

关于fabric website ,给出这个例子:

from fabric.api import env

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

据我从文档中得知,当在主机“www1”、“www2”、“www3”上执行时,此设置应该为 env dict 键“foo”提供值“bar”。我无法得到这种行为,尽管结构确实正确地确定了主机。示例 fabfile:

env.foo = 'WRONG'
@task()
def set_role():
    env.roles.append('web')

@task()
def print_foo():
    print env.foo

示例命令:

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

最佳答案

有两个问题,首先,使用的结构版本比基于字典的定义旧,因此它将键解释为主机名。这可以通过升级到 >= 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

调用方式:

fab set_role:dns do_my_task

关于python - Fabric env.roledefs 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25813995/

相关文章:

Python - 类定义中的多个@property 语句?

Linux 中的 Python 脚本

python - 如何使用 python 在连续行中找到数字模式?

python - 如何仅在单个主机上运行 @roles-decorated 结构任务

python - 关于使用 fabric 时的 argparse

python - 刚开始编写 Fabric 文件来安装包

python - 使用 perl 或 python 加强自动化

python - 为什么那个切片表达式会生成那个输出

具有 HTTP header 受控顺序的 Python HTTP 请求

python - Pandas 重新排列数据框