Przyspieszenie Ansible za pomocą Mitogen

Wiarygodne stał się jednym z najpopularniejszych Systemy zarządzania konfiguracją. Po został kupiony przez Red Hat w 2015 roku liczba uczestnicy projektu przekroczyła tysiące, a Ansible stał się prawdopodobnie najczęściej używanym systemem wdrażania i koordynacji. Jego szeroka gama zastosowań jest naprawdę imponująca.

Ansible działa poprzez połączenia SSH ze zdalnymi hostami. Otwiera sesję SSH, loguje się, kopiuje kod Pythona przez sieć i zapisuje go do oddzielnego pliku tymczasowego. Następnie plik ten jest uruchamiany na komputerze zdalnym. Cały ten ciąg operacji jest dość długi i żmudny, dlatego istnieją różne sposoby na jego optymalizację.

Jedną z takich metod jest Przepływy SSH co pozwala nam korzystać z jednej sesji SSH do wykonywania instrukcji, zamiast otwierać nową sesję za każdym razem, co może zaoszczędzić nam mnóstwo czasu. (Tylko nie zapomnij go wyłączyć requiretty ustawienie sudo w twoim /etc/sudoers plik na komputerze zdalnym)

Nowym sposobem na „przyspieszenie” Ansible jest biblioteka Pythona o nazwie mitogen. Jeśli ktoś o tym nie słyszał, pokrótce opiszę jego funkcjonalność. Umożliwia szybkie wykonywanie kodu Python na maszynie zdalnej, a Ansible jest tylko jednym z przykładów jego zastosowania. Mitogen używa potoku UNIX na komputerze zdalnym i przesyła kod Pythona skompresowany przez zlib i zserializowany przez pickle. Dzięki temu działa szybciej i oszczędza ruch. Jeśli jesteś zainteresowany bardziej szczegółowym wyjaśnieniem, najlepiej przeczytaj o tym na stronie „Jak to działa”. Dzisiaj skupimy się tylko na tym, jak biblioteka współpracuje z Ansible.

Mitogen może w pewnych okolicznościach kilkukrotnie przyspieszyć działanie kodu Ansible i znacznie zmniejszyć zużycie ruchu. Przyjrzyjmy się najpopularniejszym przypadkom użycia i zobaczmy, jak bardzo nam pomagają.

Najczęściej wykorzystuję Ansible do: tworzenia plików konfiguracyjnych na komputerze zdalnym, instalowania pakietów, kopiowania plików do i z komputera zdalnego. Być może masz inne przykłady - napisz je w komentarzach.

Chodźmy!

Konfiguracja mitogenu dla Ansible jest bardzo prosta:
Zainstaluj bibliotekę Mitogen:

pip install mitogen

Teraz istnieją dwa równoważne sposoby - albo skonfigurować opcje w pliku konfiguracyjnym ansible.cfg, albo ustawić niezbędne zmienne środowiskowe.

Załóżmy, że ścieżka do zainstalowanego Mitogenu będzie następująca: /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Następnie:

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

lub

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

Zainstalujmy Ansible w środowisku wirtualnym z Mitogenem i bez niego:

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

Należy pamiętać, że Mitogen 0.2.7 nie współpracuje z Ansible 2.8 (stan na maj 2019 r.)

Tworzymy aliasy:

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'

Spróbujmy teraz uruchomić playbook, który tworzy pliki na komputerze zdalnym:

---
- 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 }}

Uruchommy go z Mitogenem i bez niego, aby utworzyć 10 plików:

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

Widzimy dwukrotną poprawę. Sprawdźmy dla 2, 20, …, 30 plików:

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

Dzięki temu przyspieszyliśmy realizację projektu ponad 10-krotnie!
Teraz wypróbujmy różne scenariusze i zobaczmy, o ile szybciej wszystko będzie działać:

  • Skrypt umożliwiający kopiowanie plików z lokalnego hosta na zdalny (z modułem copy):
    Przyspieszenie Ansible za pomocą Mitogen

  • Skrypt do tworzenia plików na zdalnym hoście z copy moduł:
    Przyspieszenie Ansible za pomocą Mitogen

  • Scenariusz pobierania plików ze zdalnego hosta na lokalny:
    Przyspieszenie Ansible za pomocą Mitogen

Wypróbujmy scenariusz z wieloma (3) maszynami zdalnymi, na przykład scenariusz z kopiowaniem plików na zdalny host:
Przyspieszenie Ansible za pomocą Mitogen

Jak widać, Mitogen oszczędza nam w takich sytuacjach zarówno czas, jak i ruch. Jeśli jednak wąskie gardło nie leży w Ansible, lecz np. w dyskowym wejściu/wyjściu, sieci lub gdzieś indziej, to trudno oczekiwać, że Mitogen nam pomoże.

Wypróbujmy scenariusz instalacji pakietów za pomocą yum/dnf i modułów Pythona za pomocą pip. Pakiety zostały zapisane w pamięci podręcznej w celu uniknięcia zależności od awarii sieci:

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

Z Mitogenem zajęło to 12 sekund, tyle samo co bez niego.
Strona Mitogen dla strony Ansible Możesz zobaczyć inne testy i testy. Jak podaje strona:

Mitogen nie może przyspieszyć modułu w trakcie jego wykonywania. Można jedynie maksymalnie przyspieszyć wykonywanie tego modułu.

Ważne jest zatem, aby zidentyfikować wąskie gardła wdrażania i jeśli są one spowodowane przez Ansible, Mitogen pomoże Ci je rozwiązać i znacznie przyspieszyć realizację Twoich playbooków.

Źródło: www.habr.com

Kup niezawodny hosting dla stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron internetowych z ochroną DDoS, serwery VPS VDS | ProHoster