Fabric を使用して SSH ワークフローを模倣し、Web アプリケーションをデプロイするときに問題が発生します。
サーバーに SSH 接続するときの通常のコマンド フローは次のとおりです。
- root ユーザーを使用した SSH。ssh root@1.2.3.4
- Web ユーザーに切り替えます: 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 と入力するとシェル出力が出ます。スクリプトを続行するには、Ctrl-D を押す必要があります。また、自分の virtualenv をアクティブ化できません.... su - web はユーザーを正常に切り替えますweb
が、Ctrl-d が原因で (Fabric スクリプトを続行できるようにするため)、そのユーザーからログアウトし、ルートに戻ります。 .
これが私のスクリプトです:
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)
...もう 1 つ: いいえ、最初は Web としてログインできません。root としてログインする必要があります。root ユーザーではなく virtualenv を持つのは Web ユーザーです。