stał się jednym z najpopularniejszych . Po w 2015 roku liczba 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 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 . 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 . 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 mitogenTeraz 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_linearlub
[defaults]
strategy = mitogen_linear
strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategyZainstalujmy 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.10Należ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.643sWidzimy 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.197sDzię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):
Skrypt do tworzenia plików na zdalnym hoście z
copymoduł:
Scenariusz pobierania plików ze zdalnego hosta na lokalny:
Wypróbujmy scenariusz z wieloma (3) maszynami zdalnymi, na przykład scenariusz z kopiowaniem plików na zdalny host:
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 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
