我在使用 Fabric 模拟我的 SSH 工作流程来部署我的 Web 应用程序时遇到问题。
这是我通过 SSH 连接到服务器时的常用命令流程:
- SSH 使用 root 用户。ssh root@1.2.3.4
- 切换到网页用户:su - web
- 更改目录:cd /srv/web/prod/abc_project
- 启动 virtualenv:workon abc_env
- 执行 git pull:git pull origin master
- 运行脚本: build_stuff -m build
- 运行另一个脚本:./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)
...还有一件事:不,我最初无法以 Web 身份登录,我必须以 root 身份登录。拥有 virtualenv 而不是 root 用户的是 web 用户。