2012-10-26 23 views
18

Fabricを使用してSSHワーク​​フローを模倣してWebアプリケーションを展開する際に問題があります。ファブリック内のユーザーの切り替え

  1. SSHはrootユーザーを使用して:私は、サーバーへのSSHとき

    は、ここにコマンドのいつもの流れです。 WebユーザへのSSH [email protected]

  2. 切り替えます。su - ウェブ
  3. ディレクトリを変更します。cd/SRV /ウェブ/ PROD/
  4. abc_projectスタートvirtualenvの:
  5. abc_env workon gitのプルを実行します。gitの原点を引きますbuild_stuff -m
  6. 実行を構築する別のスクリプト:

を./run私はファブリックでデプロイスクリプトとしてこれを書いてみました、私はシェルの出力sを取得するファイル名を指定して実行に

  • スクリプトを習得u - 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) 
    

    ...もう一つあります:いいえ、私は当初、ウェブとしてログインすることはできませんが、私は、rootとしてログインする必要があります。 rootユーザーではなく、virtualenvを持つのはWebユーザーです。

  • 答えて

    12

    まず、別のユーザーの下でコマンドを実行する場合は、sudoを使用する必要があります。次に、workonは現在のシェルの環境変数を設定します。ファブリックはすべてのコマンドに対して新しいシェルを呼び出すので、コマンドごとに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) 
    
    +0

    ありがとうございます!私はWebユーザーを使ってgitコマンドを実行することは考えていませんでした。代わりにgitコマンドの前で 'su - web'を使い続けました。 100万のメカをありがとう! – Mark

    3

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

    3

    私はこれを達成するための方法は

    from fabric.api import settings 
    
    with settings(user='otheruser'): 
        ... 
    

    であるあなたは一度だけものの、otheruserのパスワードの入力を求められます。だからsudo su otheruserと同じではありません。rootはパスワードなしでユーザーアカウントにログインしますが、スクリプト内のユーザーを簡単に切り替えることができます。パスワードは一度だけ入力してください。

    +1

    これは一度だけうまくいった!私のプロビジョニングタスクが壊れました。 –

    関連する問題