在Fabric中切换用户

时间:2012-10-26 04:16:49

标签: python fabric

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

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

  1. 使用root用户进行SSH。 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
  8. 我尝试将其写为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)
    

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:3)

一种可能的解决方案是使用sudo操作,而不是使用su更改远程用户。

答案 2 :(得分:3)

我实现这一目标的方式是

from fabric.api import settings

with settings(user='otheruser'):
    ...

系统会提示您输入otheruser的密码,但只提示一次。所以它不等同于sudo su otheruser,其中root用户登录到没有密码的用户帐户,但这是在脚本中切换用户之间的简单方法,只需输入一次密码