Як скопіювати каталог на віддалений комп'ютер за допомогою Fabric?


79

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

Відповіді:


113

Ви також можете використовувати putдля цього (принаймні в 1.0.0):

local_pathможе бути відносним або абсолютним локальним файлом або шляхом до каталогу та може містити узагальнюючі символи у стилі оболонки , як розуміє модуль глобуса Python . Також виконується розширення тильди (реалізоване 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

Я б також розглянув модуль Інструменти проекту: документація fabric.contrib.project

Це має upload_projectфункцію, яка бере вихідний та цільовий каталог. Ще краще, є rsync_projectфункція, яка використовує rsync. Це приємно, оскільки він оновлює лише ті файли, які змінилися, і приймає додаткові аргументи типу "виключити", що приємно робити такі речі, як виключення вашого .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

набагато краще, ніж put/get. також чудово працює для завантаження завантажень користувачів із веб-сайтів, що працюють, наприклад (( upload=Falseне очевидно, що це працює в обидва боки).
benzkji

мені довелося обернути виключений каталог у список, щоб це працювало:exclude=['.git']
ryantuck

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

Для отримання додаткової інформації зверніться до документації з тканини-клаптиків .


чи є спосіб забезпечити автоматичний пароль для 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.