python - 如何告诉 Fabric 当前站点的角色是什么?

标签 python fabric

我在 fabfile.py 中只有一个命令:

@role('dev')
def test():
    local('...')

现在,我可以在每个命令中使用 --role=dev,但这非常愚蠢。

我想要的是将我的项目安装在主机上一次,并具有一定的角色,然后使用它,而无需重复此参数。

最佳答案

我通常在 fabfile.py 中包含以下内容:

if not len(env.roles):
    env.roles = ["test"]

这表示如果 env.roles 未定义(例如通过命令行),则在我的情况下应将其定义为“测试”。因此,在您的情况下,我将更改上述内容,以用 dev 替换 test,因此您将拥有:

if not len(env.roles):
    env.roles = ["dev"]

通过这样做,您应该会发现您获得了您正在寻找的行为,同时为您提供了覆盖的能力(如果您将来需要的话)。

编辑:我正在编辑此内容以包含一个小示例 fabfile.py 和用法说明。

env.roledefs = {
    'test': ['test.fabexample.com'],
    'stage': ['stage.fabexample.com'],
    'prod': ['web01.fabexample.com', 'web02.fabexample.com', 'web03.fabexample.com'],
}
# default role will be test
env.roles = ['test']

def git_pull():
    run("git pull")

def deploy():
    target = "/opt/apps/FOO"
    with cd(target):
        git_pull()
    sudo("service apache2 restart")

现在,这个 fabfile 将允许我将代码部署到三个不同环境中的任何一个:“test”、“stage”或“prod”。我通过命令行选择要部署到的环境:

fab -R stage deploy

或者,

fab --role=stage deploy

如果我指定角色结构,则由于设置了 env.roles,角色结构将默认为“test”。并不是说 Fabric 不用于对本地盒子执行任何操作,而是作用于 env.roledefs 中定义的本地盒子(或多个盒子),尽管经过一些修改,它可以在本地工作也是如此。

通常,fabric 命令是从开发盒中使用来在测试、登台或生产盒上远程执行这些操作,因此通过命令行指定角色并不是“极其愚蠢”,而是在这种情况下是设计使然。

关于python - 如何告诉 Fabric 当前站点的角色是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12806992/

相关文章:

python - 是否有可以对有限状态机进行时间逻辑模型检查的 Python 包?

python - 即使我可以使用凭据进行 SSH,Fabric 也会要求输入密码

python - Tornado 代码部署

python - 手动安装 python 依赖项不起作用。为什么?

python - Windows 中的 Fabric 自动登录

python - flask 错误 : typeerror run() got an unexpected keyword argument 'host'

python - 为什么变量赋值在列表中这样工作?

python - 如何在 Apache Spark 中保存和加载 MLLib 模型?

python - 有没有办法在 GridSearchCV 中获取所有计算的系数?

python - 如何使用 Fabric 和 fabfile 解密受密码保护的 SSH key ?