[PYTHON] Transfert de fichiers rapide avec tissu

Postscript: La méthode de http://qiita.com/NPoi/items/46364461f0ab76e986c3 est plus intelligente!

Le tissu n'est-il pas lent? Utilisons rsync. Dans le cas du transfert d'un répertoire entier avec de nombreux fichiers statiques tels que des images, HTML et JS, le temps d'exécution de fabric est radicalement différent, je vais donc le présenter. (Nous supposons que les personnes qui utilisent le tissu dans une certaine mesure)

Rsync en tant qu'utilisateur non root

C'est une fonctionnalité officielle fournie par Fabric, donc facile à utiliser.

from fabric.contrib.project import rsync_project

@task
def hoge():
	rsync_project(
		local_dir='./mydir',
		remote_dir='/usr/local/destination/mydir',
		exclude=['.DS_Tore', '*.tmp'],
		delete=True
	)

rsync en tant qu'utilisateur root

Après rsync en tant qu'utilisateur non root, vous pouvez faire mv ou cp -r, mais la bonne chose à propos de rsync est que vous ne pouvez transférer que les différences, j'ai donc créé cette fonction. Les arguments sont alignés avec rsync_project.

Le comportement est de rsync une fois vers / tmp / (valeur de hachage du nom du répertoire) / puis sudo rsync sur le serveur.

Cela dépend de la fonction is_dir de fabtools, vous avez donc besoin de pip install fabtools

import hashlib
from fabric.api import local, run, sudo
from fabric.contrib.project import rsync_project
from fabtools.files import is_dir

def root_rsync(local_dir, remote_dir, exclude=[], delete=False):
	def _end_with_slash(dir_path):
    	if dir_path[-1] == '/':
    	    return dir_path
    	else:
    	    return dir_path + '/'
    local_dir = _end_with_slash(local_dir)
    remote_dir = _end_with_slash(remote_dir)
    m = hashlib.md5()
    m.update(remote_dir)
    me = local('whoami', capture=True)
    remote_tmp_dir = '/tmp/%s/%s/' % (me, m.hexdigest())
    run('mkdir -p %s' % remote_tmp_dir)
    if is_dir(remote_dir):
        run('rsync -a %s %s' % (remote_dir, remote_tmp_dir))  # already exists
    rsync_project(
        remote_dir=remote_tmp_dir,
        local_dir=local_dir,
        exclude=exclude,
        delete=delete
    )
    sudo('rsync -a %s %s' % (remote_tmp_dir, remote_dir))

Recommended Posts

Transfert de fichiers rapide avec tissu
Transfert de fichiers bidirectionnel dans Pythonista 3
Introduction à Paramiko + scp ~ Connexion SSH ~ Transfert de fichiers avec SCP
Opération de fichier avec open - "../"
Téléchargement de fichiers avec django
Dessiner un fichier netCDF avec python
Transférer des fichiers avec Teraterm [Note]
Téléchargement de fichiers avec Flask + jQuery
Télécharger le fichier csv avec python
Créer un fichier xlsx avec XlsxWriter
Faites du SSH en plusieurs étapes avec Fabric
Extraire le fichier xz avec python
Obtenez des informations sur les fichiers vidéo avec ffmpeg-python
[Python] Ecrire dans un fichier csv avec Python
[Automatisé avec python! ] Partie 1: fichier de configuration
Téléchargement de fichiers implémenté avec Python + Bottle
Créer un fichier deb avec Docker
Sortie vers un fichier csv avec Python
Servir des fichiers statiques avec X-Send File
Donner une égalité au tissu avec la cuisine
Téléchargez le fichier déployé avec appcfg.py
Automatisation des opérations à distance avec Fabric
Utiliser le fichier d'étalonnage de la caméra avec OpenCvSharp4
Je ne pourrais pas faire de gunicorn un démon avec Fabric
[Automatisé avec python! ] Partie 2: Fonctionnement des fichiers
Ouvrir le fichier avec l'application par défaut
Environnement de déploiement facile avec gaffer + tissu
Créer un téléchargeur de fichiers avec Django