2012-02-16 2 views
7

Sto provando a utilizzare Fabric (v1.3.4) per eseguire il provisioning delle istanze di Karaf su vari server. Karaf implementa un server SSH. Quindi, ho 2 demoni ssh in esecuzione sullo stesso server; uno sulla porta 22 e uno su 8101. Utilizzando il metodo fabric.tasks.execute() di Fabric, posso collegarmi a un host alternativo: port.Come utilizzare Fabric su SSH su due porte differenti sullo stesso server?

Il problema è che la mia sessione iniziale viene dirottata dall'utente chiamato della seconda connessione a causa di un apparente dirottamento di env.user.

Ecco un esempio semplificato fabfile.py:

from fabric.api import env, run 
from fabric.tasks import execute 

env.hosts = ['192.168.5.250'] 

def firstSSH(): 
     run("echo first") 
     executeHosts = [] 
     for host in env.hosts: 
       executeHosts.append("[email protected]" + host + ":8101") 
     execute(secondSSH, hosts=executeHosts) 
     run("echo first again") 

def secondSSH(): 
    run("echo second", shell=False, pty=False) 

Entrambi SSH server sono sullo stesso server, con due porte diverse e consentendo due diversi utenti. Ecco l'output:

~/fabric$ fab firstSSH 
[192.168.5.250] Executing task 'firstSSH' 
[192.168.5.250] run: echo first 
[192.168.5.250] Login password: 
[192.168.5.250] out: first 

[[email protected]:8101] Executing task 'secondSSH' 
[[email protected]:8101] run: echo second 
[[email protected]:8101] Login password: 
[[email protected]2.168.5.250:8101] out: second 

[[email protected]:8101] run: echo first again 

Done. 
Disconnecting from 192.168.5.250:8101... done. 
Disconnecting from [email protected] done. 

Si noti come il "echo ancora prima" viene eseguito come utente notmmaley che è stato specificato rigorosamente per gli host del comando execute(). Quello che voglio (necessario) è che il comando execute() si verifichi come utente con nome per l'utente specificato : porta e quindi restituisca l'utente originale a me per le attività rimanenti. Questo è possibile con Fabric/execute() e/o dove ho sbagliato?

risposta

5

Credo che questo sia un problema risolto in Bug 568, che è patchato in Fabric 1.4.1+. Dovresti aggiornare il più recente e vedere se questo risolve il tuo problema. Su un lato nota si potrebbe essere meglio servita in questo modo per la vostra manipolazione host:

execute(secondSSH, hosts=["[email protected]%s:8101" % h for h in env.hosts]) 

Come non stai facendo alcun Vars, o semplici cicli for per popolare di loro.

+0

Grazie per il collegamento a tale riferimento. Sono stato in contatto con bitprophet ed è stato ribadito che questo comportamento era dovuto a una funzione prevista. Sembra che la correzione possa fornire una soluzione, che proverò. Grazie anche per il suggerimento su come stringere il codice. Sono nuovo di Python, quindi questo è abbastanza utile! – mmaley