Fabricを使用してSSHワークフローを模倣し、Webアプリケーションをデプロイするときに問題が発生します。
サーバーにSSHで接続するときの通常のコマンドフローは次のとおりです。
これを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ユーザーです。
まず、別のユーザーでコマンドを実行する場合は、Sudo
を使用する必要があります。次に、workon
は現在のシェルの環境変数を設定します。ファブリックはすべてのコマンドに対して新しいシェルを呼び出すため、virtualenvが必要なすべてのコマンドでworkon rhino_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)
私がこれを達成する方法は
from fabric.api import settings
with settings(user='otheruser'):
...
otheruser
のパスワードの入力を求められますが、1回だけです。したがって、同等ではないのでSudo su otheruser
、rootはパスワードなしでユーザーアカウントにログインしますが、これはスクリプト内のユーザーを切り替える簡単な方法であり、各パスワードを1回入力するだけです。
考えられる解決策の1つは、リモートユーザーをsu
で変更する代わりに、 Sudo 操作を使用することです。