80 votes

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 qu'il est assez facile en utilisant scp, mais je préférerais le faire à partir de mon fabfile.py si possible.

112voto

miku Points 63392

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

local_path peut être relative ou absolue local de fichier ou chemin d'accès au répertoire, et peut contenir les jokers de style shell, telle que comprise par le Python glob module. Tilde expansion (tel que mis en œuvre par l'os.chemin d'accès.expanduser) est également effectuée.

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


Mise à jour: Cet exemple fonctionne très bien (pour moi) sur la version 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
# ...

33voto

Seth Gottlieb Points 71

J'ai également examiné le Projet des Outils du module: tissu.contrib.projet [http://docs.fabfile.org/en/1.4.0/api/contrib/project.html]

Cela a un upload_project fonction qui prend source et le répertoire cible. Encore mieux, il y a un rsync_project fonction qui utilise rsync. C'est intéressant car il met à jour uniquement les fichiers qui ont changé et il accepte supplémentaire args comme "exclure" ce qui est agréable pour faire les choses comme à l'exclusion de 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')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X