¿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.

gaviscon_man
fuente

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 = ['[email protected]']

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')

# [[email protected]] Executing task 'copy'
# [[email protected]] run: mkdir -p /home/frodo/tmp
# [[email protected]] put: testdirectory/HELLO -> \
#     /home/frodo/tmp/testdirectory/HELLO
# [[email protected]] put: testdirectory/WORLD -> \
#     /home/frodo/tmp/testdirectory/WORLD
# ...
miku
fuente
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')
Seth Gottlieb
fuente
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.

TGO
fuente
¿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.

Exis Zhang
fuente