web-dev-qa-db-ja.com

Fabricでユーザーを切り替える

Fabricを使用してSSHワーク​​フローを模倣し、Webアプリケーションをデプロイするときに問題が発生します。

サーバーにSSHで接続するときの通常のコマンドフローは次のとおりです。

  1. Rootユーザーを使用したSSH。 ssh [email protected]
  2. Webユーザーに切り替えます:su-web
  3. ディレクトリの変更:cd/srv/web/prod/abc_project
  4. Virtualenvを開始します:workon abc_env
  5. Git pullを実行します:git pull Origin master
  6. スクリプトを実行します:build_stuff -m build
  7. 別のスクリプトを実行します:./ 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ユーザーです。

20
Mark

まず、別のユーザーでコマンドを実行する場合は、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)
13
mechmind

私がこれを達成する方法は

from fabric.api import settings

with settings(user='otheruser'):
    ...

otheruserのパスワードの入力を求められますが、1回だけです。したがって、同等ではないのでSudo su otheruser、rootはパスワードなしでユーザーアカウントにログインしますが、これはスクリプト内のユーザーを切り替える簡単な方法であり、各パスワードを1回入力するだけです。

3
Eldamir

考えられる解決策の1つは、リモートユーザーをsuで変更する代わりに、 Sudo 操作を使用することです。

3
Pedro Romano