¿Cómo copio un directorio en una máquina remota usando Fabric?


79

Tengo un directorio en mi máquina local que me gustaría copiar a una máquina remota (y cambiarle el nombre) usando Fabric. Sé que puedo copiar archivos usando put(), pero ¿qué pasa con un directorio? Sé que es bastante fácil usar scp , pero preferiría hacerlo desde dentro de mi, fabfile.pysi es posible.

Respuestas:


113

También puede usar putpara eso (al menos en 1.0.0):

local_pathpuede ser una ruta de directorio o archivo local relativa o absoluta , y puede contener comodines de estilo shell , como lo entiende el módulo glob de Python . También se realiza la expansión Tilde (tal como la implementó os.path.expanduser).

Ver: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


Actualización: este ejemplo funciona bien (para mí) en 1.0.0 .:

from fabric.api import env
from fabric.operations import run, put

env.hosts = ['frodo@middleearth.com']

def copy():
    # make sure the directory is there!
    run('mkdir -p /home/frodo/tmp')

    # our local 'testdirectory' - it may contain files or subdirectories ...
    put('testdirectory', '/home/frodo/tmp')

# [frodo@middleearth.com] Executing task 'copy'
# [frodo@middleearth.com] run: mkdir -p /home/frodo/tmp
# [frodo@middleearth.com] put: testdirectory/HELLO -> \
#     /home/frodo/tmp/testdirectory/HELLO
# [frodo@middleearth.com] put: testdirectory/WORLD -> \
#     /home/frodo/tmp/testdirectory/WORLD
# ...

Gracias. Recibo una excepción (¿es un directorio) alguna posibilidad de un ejemplo?
gaviscon_man

@gaviscon_man: Se agregó un ejemplo (probado), pero en realidad es solo vainilla fab, sin trucos. Obtendrá errores, si los directorios de destino aún no están en su lugar, por lo que incluí un simple mkdir -pantes del put. (Pero otros subdirectorios, que están debajo del testdirectory, se crearán automáticamente en la máquina remota).
Miku

Gracias, eso es muy útil.
gaviscon_man

putestá trabajando. ¿Admitirá la copia de carpetas con comprimir en la máquina de origen y descomprimir en una máquina remota?
Ram Idavalapati

32

También miraría el módulo Herramientas del proyecto: fabric.contrib.project Documentation

Tiene una upload_projectfunción que toma un directorio de origen y de destino. Aún mejor, hay una rsync_projectfunción que usa rsync. Esto es bueno porque solo actualiza los archivos que han cambiado y acepta argumentos adicionales como "excluir", lo cual es bueno para hacer cosas como excluir su .gitdirectorio.

Por ejemplo:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')

2
fabric.contrib.projectdocs para la última versión: docs.fabfile.org/en/latest/api/contrib/project.html
lsh

mucho mejor que put/get. también funciona perfectamente para obtener cargas de usuarios de sitios web en vivo, por ejemplo ( upload=Falseno es obvio que funcione en ambos sentidos).
benzkji

Tuve que envolver el directorio excluido en una lista para que esto funcione:exclude=['.git']
ryantuck

17

Para aquellos que usan Fabric 2, putya no pueden cargar directorios, solo archivos. Además, rsync_projectya no forma parte del paquete principal de Fabric. El contribpaquete se ha eliminado, como se explica aquí . Ahora, se le rsync_projectha cambiado el nombre a rsyncy necesita instalar otro paquete para poder usarlo:

pip install patchwork

Ahora, asumiendo que ya ha creado una conexión a su servidor:

cxn = fabric.Connection('username@server:22')

Puede utilizar rsynclo siguiente:

import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')

Consulte la documentación de fabric-patchwork para obtener más información.


¿Hay alguna forma de proporcionar una contraseña automática a rsync?
pg2455

2
@ pg2455 Sí, usando connect_kwargs. Por ejemplo:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO

@TGO ¿Puede compartir algún ejemplo sobre el uso de la opción de venta para transferir archivos?
Anish

@Anish putno puede cargar en Fabric 2. Si está utilizando Fabric 1, consulte la respuesta aceptada. Con Fabric 2 utilizo el ejemplo proporcionado en la respuesta, usando rsync.
TGO

0

extendiendo la respuesta de TGO, necesita una fuente de rsync como cygwin si desea usarlo en un sistema Windows.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.