在Fabric中切换用户

Mar*_*ark 19 python fabric

使用Fabric模仿我的SSH工作流来部署我的Web应用程序时遇到问题.

当我通过SSH连接到服务器时,这是我常用的命令流:

  1. SSH使用root用户.ssh root@1.2.3.4
  2. 切换到网络用户:su - web
  3. 更改目录:cd/srv/web/prod/abc_project
  4. 启动virtualenv:workon abc_env
  5. 执行git pull:git pull origin master
  6. 运行脚本:build_stuff -m build
  7. 运行另一个脚本:./ run

我尝试将其写为Fabric中的部署脚本,并在输入su-web时获得shell输出.我必须按Ctrl-D继续脚本.我也无法激活我的virtualenv ....因为:su - web成功切换用户web但由于Ctrl-d(以便我可以继续Fabric脚本),它会退出该用户并返回到root .

这是我的脚本:

env.user = 'root'

@roles('web')
def deploy():
    dev_path = '/srv/web/prod'
    app_path = '/srv/web/prod/rhino'
    workon = 'workon rhino_env'
    with prefix('su - web'):
        puts('Switched to `web` user')
        with settings(warn_only=True):
            run('kill -9 `cat /srv/web/run/rhino/rhino.pid`')
            puts('Stopped rhino...')
        with cd(app_path):
            run('git reset --hard HEAD')
            puts('Discarded all untracked and modified files')
            run('git checkout master')
            run('git pull origin master')
            users = run('users')
            puts('Output from `users` command: %s' % users)
            run(workon)
            run('build_assets -m build')
        run('cd %(dev_path)s; chown -R web:ebalu rhino' % {'dev_path': dev_path})
        run('cd %(app_path)s; ./run' % {'app_path': app_path})
        pid = run('cat /srv/web/run/rhino/rhino.pid')
        puts('Rhino started again with pid: %s.' % pid)
Run Code Online (Sandbox Code Playgroud)

...还有一件事:不,我最初无法以网络身份登录,我必须以root用户身份登录.Web用户的virtualenv不是root用户.

mec*_*ind 13

首先,您应该sudo在另一个用户下执行命令时使用.其次,workon为当前shell设置环境变量.由于结构为每个命令调用新的shell,因此您应该workon rhino_env在每个命令中运行,您需要virtualenv(即作为前缀).通过此编辑,您的代码应如下所示:

env.user = 'root'

@roles('web')
def deploy():
    dev_path = '/srv/web/prod'
    app_path = '/srv/web/prod/rhino'
    workon = 'workon rhino_env; '
    with settings(warn_only=True):
        run('kill -9 `cat /srv/web/run/rhino/rhino.pid`')
        puts('Stopped rhino...')
    with cd(app_path):
        sudo('git reset --hard HEAD', user='web')
        puts('Discarded all untracked and modified files')
        sudo('git checkout master', user='web')
        sudo('git pull origin master', user='web')
        users = run('users')
        puts('Output from `users` command: %s' % users)

        with prefix(workon):
            sudo('build_assets -m build', user='web')
    with cd(dev_path):
        run('chown -R web:ebalu rhino')

    with cd(app_path):
        sudo('./run', user='web')

    pid = run('cat /srv/web/run/rhino/rhino.pid')
    puts('Rhino started again with pid: %s.' % pid)
Run Code Online (Sandbox Code Playgroud)