Làm cách nào để sao chép thư mục vào một máy từ xa bằng Fabric?


79

Tôi có một thư mục trên máy cục bộ của mình mà tôi muốn sao chép vào một máy từ xa (và đổi tên nó) bằng Fabric. Tôi biết tôi có thể sao chép tệp bằng cách sử dụng put(), nhưng còn thư mục thì sao. Tôi biết nó đủ dễ dàng bằng cách sử dụng scp , nhưng tôi muốn làm điều đó từ bên trong của mình fabfile.pynếu có thể.

Câu trả lời:


113

Bạn cũng có thể sử dụng putcho điều đó (ít nhất là trong 1.0.0):

local_pathcó thể là một tệp hoặc đường dẫn thư mục tương đối hoặc cục bộ tuyệt đối và có thể chứa các ký tự đại diện kiểu shell , như được hiểu bởi mô-đun toàn cầu Python . Mở rộng dấu ngã (như được thực hiện bởi os.path.expanduser) cũng được thực hiện.

Xem: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fainst.operations.put


Cập nhật: Ví dụ này hoạt động tốt (đối với tôi) trên 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
# ...

Cảm ơn. Tôi nhận được một ngoại lệ (Là một thư mục) bất kỳ cơ hội của một ví dụ?
gaviscon_man

@gaviscon_man: Đã thêm một ví dụ (đã thử nghiệm), nhưng thực sự nó chỉ là vani fab, không có thủ thuật. Bạn sẽ gặp lỗi, nếu các thư mục đích chưa được đặt sẵn - vì vậy tôi đã bao gồm một đơn giản mkdir -ptrước put. (Nhưng các thư mục con khác, bên dưới testdirectorysẽ tự động được tạo trên máy từ xa).
miku

Cảm ơn bạn, điều đó rất hữu ích.
gaviscon_man

putđang làm việc. Nó sẽ hỗ trợ sao chép thư mục với nén ở máy nguồn và giải nén ở máy từ xa.
Ram Idavalapati

32

Tôi cũng sẽ xem xét mô-đun Công cụ Dự án: Fabric.contrib.project Documentation

Điều này có một upload_projectchức năng lấy một nguồn và thư mục đích. Thậm chí tốt hơn, có một rsync_projectchức năng sử dụng rsync. Điều này rất hay vì nó chỉ cập nhật các tệp đã thay đổi và nó chấp nhận các args bổ sung như "loại trừ", rất tốt để thực hiện những việc như loại trừ .gitthư mục của bạn .

Ví dụ:

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.projecttài liệu cho phiên bản mới nhất: docs.fabfile.org/en/latest/api/contrib/project.html
lsh

cách tốt hơn put/get. cũng hoạt động hoàn hảo để tìm nạp các tải lên của người dùng từ các trang web trực tiếp chẳng hạn ( upload=Falsekhông rõ ràng là nó hoạt động theo cả hai cách).
benzkji

tôi đã phải đưa đồng dir bị loại trừ vào một danh sách để làm cho nó hoạt động:exclude=['.git']
ryantuck

16

Đối với những người sử dụng Fabric 2, putkhông còn có thể tải lên thư mục, chỉ có tệp. Ngoài ra, rsync_projectkhông còn là một phần của gói Vải chính. Các contribgói đã được gỡ bỏ, như đã giải thích ở đây . Bây giờ, rsync_projectđã được đổi tên thành rsyncvà bạn cần cài đặt một gói khác để có thể sử dụng nó:

pip install patchwork

Bây giờ, giả sử bạn đã tạo kết nối với máy chủ của mình:

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

Bạn có thể sử dụng rsyncnhư sau:

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

Vui lòng tham khảo tài liệu về chắp vá vải để biết thêm thông tin.


có cách nào để cung cấp mật khẩu tự động cho rsync không?
pg2455 19/03/19

2
@ pg2455 Có, đang sử dụng connect_kwargs. Ví dụ:cxn = fabric.Connection('username@server:22', connect_kwargs=dict(password='yourpass'))
TGO

@TGO Bạn có thể chia sẻ bất kỳ ví dụ nào về việc sử dụng tùy chọn put để truyền tệp không?
Anish

@Anish putkhông thể tải lên trong Vải 2. Nếu bạn đang sử dụng Vải 1, vui lòng tham khảo câu trả lời được chấp nhận. Với Vải 2, tôi sử dụng ví dụ được cung cấp trong câu trả lời, bằng cách sử dụng rsync.
TGO

0

Theo câu trả lời của TGO, bạn cần một nguồn rsync chẳng hạn như cygwin nếu bạn muốn sử dụng nó trên hệ thống Windows.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.