2015-01-16 17 views
39

Tôi đang sử dụng Ansible để sao chép một thư mục (900 tác phẩm, 136MBytes) từ một máy chủ khác:Tại sao sao chép thư mục với Ansible quá chậm?

--- 
- name: copy a directory 
    copy: src={{some_directory}} dest={{remote_directory}} 

hoạt động này có một đáng kinh ngạc 17 phút, trong khi một đơn giản scp -r <src> <dest> mất vỏn vẹn 7 giây.

Tôi đã thử chế độ Accelerated, theo ansible docs "có thể ở bất cứ đâu từ 2-6x nhanh hơn SSH với ControlPersist được bật và nhanh hơn so với paramiko 10 lần.", Nhưng không có kết quả.

+0

Tôi biết rằng nó là một hash MD5 và xác nhận nó, nhưng mà thời gian bạn đang nhìn thấy sẽ thấy rất lớn. –

+0

@CatManDo chạy sha1, trên thực tế và điều đó không có trách nhiệm (mặc dù đó là phỏng đoán đầu tiên của tôi). – tedder42

Trả lời

63

TLDR: sử dụng synchronize thay vì copy.

Đây là copy lệnh Tôi đang sử dụng:

- copy: src=testdata dest=/tmp/testdata/ 

Là một đoán, tôi giả sử các hoạt động đồng bộ hóa chậm. Các files module documentation ngụ ý điều này quá:

Cơ sở sao chép mô-đun "sao chép" không chia tỷ lệ cho nhiều (> hàng trăm) tệp. Để thay thế, hãy xem mô-đun đồng bộ hóa, là một trình bao bọc xung quanh rsync.

Đào vào nguồn hiển thị each file is processed with SHA1. Đó là implemented using hashlib.sha1. Một thử nghiệm địa phương ngụ ý rằng chỉ mất 10 giây cho 900 tệp (điều đó xảy ra để mất 400mb không gian).

Vì vậy, đại lộ tiếp theo. Bản sao được xử lý với module_utils/basic.py's atomic_move method. Tôi không chắc chắn nếu chế độ tăng tốc giúp (đó là một mostly-deprecated feature), nhưng tôi đã cố gắng pipelining, đặt điều này trong một địa phương ansible.cfg:

[ssh_connection] 
pipelining=True 

Nó không xuất hiện để giúp; mẫu của tôi mất 24 phút để chạy. Rõ ràng là một vòng lặp kiểm tra một tệp, tải lên tệp đó, sửa các quyền, sau đó bắt đầu trên tệp tiếp theo. Đó là rất nhiều lệnh, ngay cả khi kết nối ssh được mở. Đọc giữa các dòng nó làm cho một chút ý nghĩa - "chuyển tập tin" không thể được thực hiện trong pipelining, tôi nghĩ.

Vì vậy, sau khi gợi ý để sử dụng synchronize lệnh:

- synchronize: src=testdata dest=/tmp/testdata/ 

Đó mất 18 giây, ngay cả với pipeline=False. Rõ ràng, lệnh synchronize là cách để thực hiện trong trường hợp này.

Lưu ý synchronize sử dụng rsync, mặc định là thời gian mod và kích thước tệp. Nếu bạn muốn hoặc cần kiểm tra, hãy thêm checksum=True vào lệnh. Ngay cả khi kiểm tra cho phép thời gian không thực sự thay đổi - vẫn còn 15-18 giây. Tôi xác nhận tùy chọn checksum là trên bằng cách chạy ansible-playbook với -vvvv, có thể được nhìn thấy ở đây:

ok: [testhost] => {"changed": false, "cmd": "rsync --delay-updates -FF --compress --checksum --archive --rsh 'ssh -o StrictHostKeyChecking=no' --out-format='<<CHANGED>>%i %n%L' \"testdata\" \"[email protected]:/tmp/testdata/\"", "msg": "", "rc": 0, "stdout_lines": []} 
+3

Câu trả lời thú vị. –

+1

Không có cách nào để mô-đun sao chép nhanh hơn? Điều này có vẻ như một lỗi trong bản sao cho nó được như vậy chậm? –

+0

Bạn đã đọc câu trả lời chưa? Có những con đường. – tedder42

5

synchronize cấu hình có thể được difficult trong môi trường với become_user.Đối với việc triển khai một lần bạn có thể lưu trữ thư mục nguồn và sao chép nó với unarchive mô-đun:

- name: copy a directory 
    unarchive: 
    src: some_directory.tar.gz 
    dest: {{remote_directory}} 
    creates: {{remote_directory}}/indicator_file