Как скопировать каталог на удаленный компьютер с помощью Fabric?

79

У меня есть каталог на моем локальном компьютере, который я хотел бы скопировать на удаленный компьютер (и переименовать) с помощью Fabric. Я знаю, что могу скопировать файл с помощью put(), но как насчет каталога. Я знаю, что использовать scp достаточно просто , но я бы предпочел делать это изнутри, fabfile.pyесли это возможно.

gaviscon_man
источник

Ответы:

113

Вы также можете использовать putдля этого (по крайней мере, в 1.0.0):

local_pathможет быть относительным или абсолютным локальным файлом или путем к каталогу и может содержать подстановочные знаки в стиле оболочки , как это понимается модулем Python glob . Также выполняется расширение тильды (как реализовано в os.path.expanduser).

См. Http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


Обновление: этот пример отлично работает (для меня) на 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
# ...
мику
источник
Благодарю. Я получаю исключение (есть ли каталог), есть ли пример?
gaviscon_man
@gaviscon_man: Добавлен (проверенный) пример, но на самом деле это просто ваниль fab, никаких уловок. Вы получите ошибки, если целевые каталоги еще не созданы, поэтому я включил простой mkdir -pперед расширением put. (Но другие подкаталоги, находящиеся ниже, testdirectoryбудут автоматически созданы на удаленном компьютере).
miku
Спасибо, это очень помогло.
gaviscon_man
putработает. Будет ли он поддерживать копирование папки со сжатием на исходной машине и распаковкой на удаленной машине.
Рам Идавалапати
32

Я бы также посмотрел на модуль Project Tools: fabric.contrib.project Documentation

У этого есть upload_projectфункция, которая принимает исходный и целевой каталог. Более того, есть rsync_projectфункция, использующая rsync. Это хорошо, потому что он обновляет только те файлы, которые были изменены, и принимает дополнительные аргументы, такие как «exclude», что удобно для таких вещей, как исключение вашего .gitкаталога.

Например:

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.projectдокументы для последней версии: docs.fabfile.org/en/latest/api/contrib/project.html
lsh 01
намного лучше, чем put/get. также отлично работает, например, для загрузки пользовательских загрузок с живых веб-сайтов ( upload=Falseне очевидно, что это работает в обоих направлениях).
benzkji
Мне пришлось обернуть исключенный exclude=['.git']
каталог
17

Те, кто использует Fabric 2, putбольше не могут загружать каталоги, только файлы. Кроме того, rsync_projectон больше не является частью основного пакета Fabric. contribПакет был удален, как описано здесь . Теперь rsync_projectон был переименован в rsync, и вам нужно установить другой пакет, чтобы иметь возможность его использовать:

pip install patchwork

Теперь, если вы уже создали соединение с вашим сервером:

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

Вы можете использовать rsyncкак показано ниже:

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

Пожалуйста, обратитесь к документации по ткани-пэчворк для получения дополнительной информации.

TGO
источник
есть ли способ предоставить автоматический пароль для rsync?
pg2455
2
@ pg2455 Да, используя connect_kwargs. Например:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO
@TGO Можете ли вы поделиться каким-либо примером использования опции put для передачи файла?
Аниш
@Anish putне может загружать в Fabric 2. Если вы используете Fabric 1, обратитесь к принятому ответу. С Fabric 2 я использую пример, приведенный в ответе, используя rsync.
TGO
0

расширяя ответ TGO, вам понадобится источник rsync, такой как cygwin, если вы хотите использовать его в системе Windows.

Эксис Чжан
источник