Fabric: 超出“主机”的其他角色定义键未加载到环境中

创建于 2015-02-13  ·  7评论  ·  资料来源: fabric/fabric

文档中的这个片段不会通过 env 使用户可以使用示例键“foo”,只有“hosts”键随后被 Fabric 加载(到 env.hosts 中)

from fabric.api import env

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

这个stackoverlow问题上进一步记录

最有用的评论

@bitprophet为什么这被关闭了? 额外的 roledef 键的行为没有改变,所以这是“不会修复”吗?

所有7条评论

您可以使用以下示例作为配置文件,然后添加一些内部函数来处理 fabfiles.py

像:list.db
接口|ip|密码|角色....
希望它对你有用。

Fabric 使用多个 env 键来确定每个会话连接到哪个主机,即角色、有效角色、主机、主机字符串。 当然还有装饰器。

也就是说,roledefs 只是用于分组主机的名称映射,不需要合并到 env.hosts 中。

将 roledef 定义为 dict 有助于您组织其他自定义设置,在主机旁边,是特定于角色的。 您可以通过完整的 env 路径访问它们,即 env.roledefs.web.foo

但是,就像您提出的问题,并且可能期望,定义为 dict 的角色应该合并到 env 根。
这也是我个人使用它的目的。 由于在执行特定任务时实际设置/获取“当前”角色的所有可能方法,以及在任务中调用子任务时的复杂性,我还没有找到实现它和拉取请求的好方法. 简单地解释说,我通过订阅对 env 的更改并在 env 中设置密钥roles时合并角色来做到这一点。 但“困难”部分是在会话中使用新角色时保持状态并清除任何合并的角色。

env.roledefs.web.foo 产生错误: AttributeError: 'dict' object has no attribute 'web'

我的意思是你可以像普通字典一样访问它, env.roledefs['web']['foo'] 但是我不明白为什么这个功能在 Fabric 中存在,它只是一个普通的字典。 似乎这个功能是出于更有用的原因而实现的?

对不起,你说得对,你必须像你说的那样访问它。

目前,除了允许您在主机旁边对更多角色设置进行分组之外,没有其他原因。
但是,当里程碑 1.11 发布并且#1092 存在时,它就更有意义了。

此外,#1088 是 1.11 的一部分,与您的描述/期望相似。 但正如我所说,我还没有找到一个很好的方法来实现角色定义的合并。 仅使用“丑陋”的深度猴子补丁在分叉中进行概念验证。

啊好吧,我把头撞在墙上,以为我遗漏了一些东西:) 那些引用的问题编号看起来它们在滚动时会有所帮助。 谢谢乔纳斯!

这令人困惑,我认为应该在文档中指出这些附加变量在角色定义之外是不可访问的。

@bitprophet为什么这被关闭了? 额外的 roledef 键的行为没有改变,所以这是“不会修复”吗?

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

haydenflinner picture haydenflinner  ·  5评论

omzev picture omzev  ·  6评论

jmcgrath207 picture jmcgrath207  ·  5评论

jamesob picture jamesob  ·  3评论

TimotheeJeannin picture TimotheeJeannin  ·  3评论