使用Fabric模仿我的SSH工作流来部署我的Web应用程序时遇到问题.
当我通过SSH连接到服务器时,这是我常用的命令流:
我尝试将其写为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)