Tăng tốc Ansible với Mitogen

Có khả năng đã trở thành một trong những phổ biến nhất Quản lý cấu hình hệ thống. Sau đã được Red Hat mua lại năm 2015 con số người tham gia dự án đã vượt quá hàng nghìn và Ansible có lẽ đã trở thành hệ thống điều phối và triển khai được sử dụng nhiều nhất. Phạm vi ứng dụng rộng rãi của nó rất ấn tượng.

Ansible hoạt động trên các kết nối SSH tới máy chủ từ xa. Nó mở một phiên SSH, đăng nhập, sao chép mã Python qua mạng và ghi nó vào một tệp tạm thời riêng biệt. Sau đó, nó chạy tập tin này trên máy từ xa. Toàn bộ chuỗi thao tác này khá dài và tẻ nhạt, vì vậy có nhiều cách khác nhau để tối ưu hóa nó.

Một trong những cách này là Đường ống SSH cho phép bạn sử dụng một phiên SSH để thực hiện các hướng dẫn, thay vì mở một phiên mới mỗi lần, điều này có thể giúp chúng tôi tiết kiệm rất nhiều thời gian. (Chỉ cần nhớ tắt requiretty cài đặt cho sudo trong của bạn /etc/sudoers tập tin trên máy từ xa)

Một cách mới để ép xung Ansible là một thư viện python có tên Mitogen. Nếu ai chưa từng nghe về nó, tôi sẽ mô tả ngắn gọn chức năng của nó. Nó cho phép thực thi nhanh mã python trên một máy từ xa và Ansible chỉ là một ví dụ về việc sử dụng. Mitogen sử dụng ống UNIX trên máy từ xa và chuyển mã python được nén bằng zlib và được tuần tự hóa bằng dưa chua. Điều này giúp hoàn thành nó nhanh hơn và tiết kiệm lưu lượng. Nếu bạn quan tâm đến lời giải thích chi tiết hơn, tốt nhất bạn nên đọc về nó trên trang "Làm thế nào nó hoạt động". Nhưng hôm nay chúng ta sẽ chỉ tập trung vào cách thư viện hoạt động với Ansible.

Mitogen trong một số trường hợp nhất định có thể tăng tốc mã Ansible của bạn lên nhiều lần và giảm đáng kể mức tiêu thụ lưu lượng. Hãy xem các trường hợp sử dụng phổ biến nhất và xem nó giúp ích cho chúng ta đến mức nào.

Tôi sử dụng Ansible nhiều nhất cho: tạo tệp cấu hình trên máy từ xa, cài đặt gói, sao chép tệp đến và từ máy từ xa. Có lẽ bạn có những ví dụ khác - hãy viết bình luận.

Chúng ta hãy đi!

Cấu hình Mitogen cho Ansible rất đơn giản:
Cài đặt thư viện Mitogen:

pip install mitogen

Bây giờ có hai cách tương đương - định cấu hình các tùy chọn trong tệp cấu hình ansible.cfg hoặc đặt các biến môi trường cần thiết.

Giả sử rằng đường dẫn đến Mitogen đã cài đặt sẽ là /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Sau đó:

export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
export ANSIBLE_STRATEGY=mitogen_linear

hoặc

[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy

Hãy cài đặt Ansible trong virtualenv, có và không có Mitogen:

virtualenv mitogen_ansible
./mitogen_ansible/bin/pip install ansible==2.7.10 mitogen
virtualenv pure_ansible
./pure_ansible/bin/pip install ansible==2.7.10

Xin lưu ý rằng Mitogen 0.2.7 không hoạt động với Ansible 2.8 (kể từ tháng 2019 năm XNUMX)

Tạo bí danh:

alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook'
alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'

Bây giờ, hãy thử chạy một playbook tạo tệp trên máy từ xa:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Create files with copy content module
      copy:
        content: |
          test file {{ item }}
        dest: ~/file_{{ item }}
      with_sequence: start=1 end={{ n }}

Và hãy chạy nó có và không có Mitogen để tạo 10 tệp:

time mitogen-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null

real    0m2.603s
user    0m1.152s
sys     0m0.096s

time pure-ansible-playbook file_creation.yml -i hosts -e n=10 &>/dev/null

real    0m5.908s
user    0m1.745s
sys     0m0.643s

Chúng tôi thấy sự cải thiện gấp 2 lần. Hãy kiểm tra 20, 30, ..., 100 tệp:

time pure-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null

real    0m51.775s
user    0m8.039s
sys     0m6.305s

time mitogen-ansible-playbook file_creation.yml -i hosts -e n=100 &>/dev/null

real    0m4.331s
user    0m1.903s
sys     0m0.197s

Kết quả là chúng tôi đã tăng tốc độ thực thi lên hơn 10 lần!
Bây giờ, hãy thử các kịch bản khác nhau và xem mọi thứ hoạt động nhanh hơn như thế nào đối với chúng tôi:

  • Tập lệnh sao chép tập tin vào máy chủ từ xa từ máy chủ cục bộ (với mô-đun copy):
    Tăng tốc Ansible với Mitogen

  • Tập lệnh tạo tập tin trên máy chủ từ xa với copy mô-đun:
    Tăng tốc Ansible với Mitogen

  • Kịch bản tải tập tin từ máy chủ từ xa về máy chủ cục bộ:
    Tăng tốc Ansible với Mitogen

Hãy thử một kịch bản với một số (3) máy từ xa, ví dụ như kịch bản sao chép tệp vào máy chủ từ xa:
Tăng tốc Ansible với Mitogen

Như bạn có thể thấy, Mitogen giúp chúng tôi tiết kiệm cả thời gian và lưu lượng truy cập trong những tình huống này. Nhưng nếu nút cổ chai không nằm ở Ansible, mà chẳng hạn như ở I/O của đĩa hoặc mạng, hoặc ở một nơi nào khác, thì thật khó để mong đợi rằng Mitogen sẽ giúp chúng ta.

Hãy thử một tập lệnh cài đặt các gói có mô-đun yum/dnf và python bằng pip. Các gói đã được lưu vào bộ nhớ đệm để không phụ thuộc vào sự cố mạng:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Install packages
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Install pip modules
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

Với Mitogen mất 12 giây, giống như không có nó.
Trên trang Trang Mitogen cho Ansible bạn có thể xem các điểm chuẩn và bài kiểm tra khác. Như trang nêu:

Mitogen không thể tăng tốc mô-đun khi nó đang chạy. Nó chỉ có thể thực hiện mô-đun này nhanh nhất có thể.

Do đó, điều quan trọng là phải tìm ra những điểm nghẽn trong quá trình triển khai của bạn và nếu chúng là do Ansible thì Mitogen sẽ giúp bạn giải quyết chúng và tăng tốc đáng kể việc thực thi các sổ chơi của bạn.

Nguồn: www.habr.com

Thêm một lời nhận xét