web-dev-qa-db-fra.com

Comment copier un répertoire sur une machine distante à l'aide de Fabric?

J'ai un répertoire sur ma machine locale que je voudrais copier sur une machine distante (et le renommer) à l'aide de Fabric. Je sais que je peux copier un fichier en utilisant put(), mais qu’en est-il d’un répertoire? Je sais que c’est assez facile d’utiliser scp , mais je préférerais le faire depuis mon fabfile.py si possible.

76
gaviscon_man

Vous pouvez aussi utiliser put (au moins dans la version 1.0.0):

local_path peut être un fichier local relatif ou absolu ou un chemin directory, et peut contenir des caractères génériques style Shell, tels que compris par le module Python glob. Le développement de tilde (tel qu’implémenté par os.path.expanduser) est également effectué.

Voir: http://docs.fabfile.org/fr/1.0.0/api/core/operations.html#fabric.operations.put


Mise à jour: Cet exemple fonctionne bien (pour moi) sous 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
# ...
110
miku

Je voudrais aussi regarder le module Outils de projet: fabric.contrib.project Documentation

Cela a une fonction upload_project qui prend un répertoire source et un répertoire cible. Mieux encore, il existe une fonction rsync_project qui utilise rsync. Ceci est agréable car il ne met à jour que les fichiers qui ont été modifiés et accepte des arguments supplémentaires tels que "exclude", ce qui est pratique pour exclure votre répertoire .git.

Par exemple:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

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

Pour ceux qui utilisent Fabric 2, put ne peut plus télécharger de répertoires, mais uniquement des fichiers. De plus, rsync_project ne fait plus partie du package Fabric principal. Le paquetage contrib a été supprimé, comme expliqué ici . Désormais, rsync_project a été renommé en rsync et vous devez installer un autre package pour pouvoir l'utiliser:

pip install patchwork

Maintenant, en supposant que vous ayez déjà créé une connexion à votre serveur:

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

Vous pouvez utiliser rsync comme ci-dessous:

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

Veuillez vous référer à la documentation fabric-patchwork pour plus d'informations.

1
TGO

pour prolonger la réponse de TGO, vous avez besoin d'une source de rsync telle que cygwin si vous souhaitez l'utiliser un système Windows.

0
Exis Zhang