2012-02-16 12 views
7

Estoy tratando de usar Fabric (v1.3.4) para aprovisionar instancias de Karaf en varios servidores. Karaf implementa un servidor SSH. Entonces, tengo 2 daemons ssh corriendo en el mismo servidor; uno en el puerto 22 y otro en 8101. Usando el método fabric.tasks.execute() de Fabric, puedo conectarme a un host host: port.¿Cómo uso Fabric to SSH en dos puertos diferentes en el mismo servidor?

El problema es que mi sesión inicial es secuestrada por el usuario nombrado de la segunda conexión debido a un aparente secuestro de env.user.

Aquí está un ejemplo simplificado 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) 

Ambos servidores SSH están en el mismo servidor, con en dos puertos diferentes y permitiendo que dos usuarios diferentes. Aquí está la salida:

~/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]:8101] out: second 

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

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

Nota cómo la "eco primera vez" se ejecuta como el usuario que se especificó notmmaley estrictamente para anfitriones del comando de ejecución(). Lo que quiero (necesito) es que el comando execute() se produzca como usuario con nombre para el usuario especificado @ host: puerto y luego me devuelva el usuario original para las tareas restantes. ¿Es esto posible con Fabric/execute() y/o dónde me he equivocado?

Respuesta

5

Creo que este es un problema abordado en Bug 568, que está parcheado en Fabric 1.4.1+. Debe actualizar a la más nueva y ver si esto resuelve su problema. En un lado en cuenta que podría estar mejor servido por hacer esto para su manipulación anfitrión:

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

Como usted no está haciendo ningún VARs, o simple para bucles para poblar ellos.

+0

Gracias por el enlace a esa referencia de error. He estado en contacto con bitprophet y se confirmó que este comportamiento se debió a una función prevista. Parece que la solución podría proporcionar una solución, que intentaré. Gracias también por la sugerencia sobre cómo ajustar el código. Soy nuevo en Python, ¡así que esto es bastante útil! – mmaley

Cuestiones relacionadas