在织物中切换用户

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

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

当我使用Fabric来模拟我的SSH工作流来部署我的Web应用程序时,我遇到了一个问题。

下面是我向服务器SSH时的常用命令流:

  1. 使用root user.ssh root@1.2.3.4的SSH
  2. 切换到web用户:su-web
  3. 更改目录:cd/srv/web/prod/abc_工程项目
  4. 启动Virtualenv:workon abc_环境变化
  5. 执行git拉:git拉源母版
  6. 运行脚本:构建_东西-我建
  7. 运行另一个脚本:./运行

我试着在Fabric中将它写成部署脚本,当输入su-web时,我会得到一个shell输出。我得按下Ctrl-D键才能继续剧本。我也无法激活我的虚拟服务器。因为: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用户拥有虚拟用户,而不是根用户。

提问于
用户回答回答于

首先,你应该用sudo在另一个用户下执行命令时。第二,workon为当前shell设置环境变量。因为Fabric为每个命令调用新的shell,所以应该运行workon rhino_env在每个命令中,都需要虚拟env(即前缀)。通过这个编辑,代码应该如下所示:

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)
用户回答回答于

一个可能的解决方案是使用sudo操作,而不是将远程用户更改为su.

扫码关注云+社区