通过Fabric作为部署用户激活虚拟服务器

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我想在本地运行Fabric脚本,这个脚本将依次登录到我的服务器,将用户切换到部署,激活Projects.Virtualenv,这将将dir更改为项目并发出git拉出。

def git_pull():
    sudo('su deploy')
    # here i need to switch to the virtualenv
    run('git pull')

我通常使用虚拟包装器中的workon命令,该命令来源于激活文件和postactivate文件,它将我放入项目文件夹中。在这种情况下,由于Fabric是从shell内部运行的,所以控制被交给了Fabric,所以我不能使用bash的内置源代码“$source~/.virtualenv/myvenv/bin/activate”。

有谁能举例解释一下他们是如何做到的呢?

提问于
用户回答回答于

def task():
    workon = 'workon myvenv && '
    run(workon + 'git pull')
    run(workon + 'do other stuff, etc')

从1.0版开始,Fabric就有一个prefix上下文管理器它使用此技术,因此您可以例如:

def task():
    with prefix('workon myvenv'):
        run('git pull')
        run('do other stuff, etc')
*在某些情况下,必然会使用command1 && command2接近可能会在你身上爆炸,例如当command1失败(command2(永远不会跑)或者如果command1没有正确转义,并且包含特殊的shell字符,等等。
用户回答回答于

from __future__ import with_statement
from fabric.api import *
from contextlib import contextmanager as _contextmanager

env.hosts = ['servername']
env.user = 'deploy'
env.keyfile = ['$HOME/.ssh/deploy_rsa']
env.directory = '/path/to/virtualenvs/project'
env.activate = 'source /path/to/virtualenvs/project/bin/activate'

@_contextmanager
def virtualenv():
    with cd(env.directory):
        with prefix(env.activate):
            yield

def deploy():
    with virtualenv():
        run('pip freeze')

扫码关注云+社区