20

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

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

  1. root ユーザーを使用した SSH。ssh root@1.2.3.4
  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 ユーザーです。

4

3 に答える 3

16

まず、sudo別のユーザーでコマンドを実行するときに使用する必要があります。次に、workon現在のシェルの環境変数を設定します。ファブリックはすべてのコマンドに対して新しいシェルを呼び出すため、workon rhino_envvirtualenvが必要な(つまりプレフィックスとして)すべてのコマンドで実行する必要があります。この編集により、yorコードは次のようになります。

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)
于 2012-10-26T18:56:00.213 に答える
4

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

from fabric.api import settings

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

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

于 2016-02-16T13:21:50.170 に答える
3

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

于 2012-10-26T08:00:58.153 に答える