11

最近、リモート展開用のファブリックを検討し始めました。(ログインしたユーザーから)diffユーザーに切り替える必要があり、それを理解できません。もしそうなら、それも可能ですか?現在のユーザーにはsudo権限がありません。

以下の環境変数を変更してみました

env.sudo_prefix = "su newUser -c "
env.sudo_prompt = "Password:"

ただし、ファブリックは「newUser」のパスワード入力を待機せず、失敗します。

out: Password: 
[oldUser@ec2-111-11-111-111.compute-1.amazonaws.com] out: su: incorrect password

Fatal error: sudo() received nonzero return code 1 while executing!

Requested: touch x
Executed: su newUser -c  -u "root"  /bin/bash -l -c "cd /home/oldUser/upgrade && touch x"

Aborting.
Disconnecting from oldUser@ec2-111-11-111-111.compute-1.amazonaws.com... done.

アップデート:

JFセバスティアンが提案したように、su newUser -c機能しますが、すべてのサーバーのすべてのコマンドに対してパスワードを要求するため、自動化の目的が損なわれます。プロンプトに基づいて同じ値を渡す方法はFabricにありますか(この場合、常にPassword:

4

2 に答える 2

11

JFセバスティアンに感謝します、いくつかのキャッチがありました。

  1. ファブリックは接続を遅延させるため、コンテキストスイッチを回避するためにsuを呼び出す前にダミー接続を作成する必要がありました。
  2. Pwdはグローバルスコープに保存し、再利用できるようにする必要があります。ファブリックは、オーバーライドされたsuコマンドのためにそれをキャッシュに入れません。

これが最終的な結果です。その動作。

pwd = None
@hosts('myhost.com')
def test():
    with cd('/home/oldUser/upgrade'):
        run('ls')  #This is to connect aggressively (instead of lazily)
        global pwd  #Change the scope of pwd
        if pwd is None:
            pwd = getpass.getpass('enter password for newUser')

        execute(su, pwd, 'newUser', 'touch x')  
        run ('ls')
        execute(su, pwd, 'newUser', 'rm x') 
        run ('ls')

def su(pwd, user, command):
    with settings(
        password= "%s" % pwd,
        sudo_prefix="su %s -c " % user,
        sudo_prompt="Password:"
        ):
        sudo(command)
于 2012-09-28T22:58:29.340 に答える
7

sshがnewuserできず、使用できない場合sudo(command, user='newuser')

import getpass # just for demonstration
from fabric.api import sudo, settings

def su(user, command):
    with settings(password=getpass.getpass('enter password for %s: ' % user),
                  sudo_prefix="su %s -c " % user,
                  sudo_prompt="Password:"):
        sudo(command)
于 2012-09-28T18:19:29.763 に答える