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": []}
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. –
@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