Zrychlení Ansible pomocí Mitogen

Ansible stala jednou z nejpopulárnějších systémů pro řízení konfigurace. Poté, co byl zakoupen společností Red Hat v roce 2015 počet účastníků projektu překročil tisíce a Ansible se stal pravděpodobně nejpoužívanějším systémem pro nasazení a orchestraci. Jeho široké aplikační oblasti jsou velmi impozantní.

Ansible pracuje přes SSH spojení k vzdáleným hostitelům. Otevře SSH relaci, přihlásí se, zkopíruje kód v Pythonu přes síť a uloží jej do samostatného dočasného souboru. Poté spustí tento soubor na vzdáleném stroji. Celý tento sled operací je poměrně dlouhý a nudný, proto existují různé způsoby, jak jej optimalizovat.

Jedním z těchto způsobů je SSH pipelines , který umožňuje použít jednu SSH relaci pro provádění instrukcí, místo aby se každýkrát otevírala nová relace, což může ušetřit spoustu času. (Jen nezapomeňte vypnout requiretty nastavení pro sudo ve vašem /etc/sudoers souboru na vzdáleném stroji)

Novým způsobem, jak „zrychlit“ Ansible, je knihovna Pythonu s názvem Mitogen. Pokud o ní někdo neslyšel – pak v krátkosti popíšu její funkcionalitu. Umožňuje rychlé provádění kódu Pythonu na vzdáleném stroji a Ansible je pouze jedna z příkladů použití. Mitogen využívá UNIX pipe na vzdáleném stroji a přenáší kód Pythonu komprimovaný pomocí zlib a serializovaný pomocí pickle. To pomáhá rychleji provádět a šetří přenos dat. Pokud máte zájem o podrobnější vysvětlení, je nejlepší přečíst si o tom na stránce „Jak to funguje“. Dnes se však zaměříme pouze na práci knihovny s Ansible.

Mitogen může v určitých okolnostech zrychlit váš Ansible kód několikrát a významně snížit spotřebu dat. Podívejme se na nejpopulárnější příklady použití a zjistíme, jak nám to pomáhá.

Nejvíce používám Ansible k: vytváření konfiguračních souborů na vzdáleném stroji, instalaci balíčků, kopírování souborů na vzdálený stroj a zpět. Možná máte další příklady – napište je do komentářů.

Začínáme!

Konfigurace Mitogen pro Ansible je velmi jednoduchá:
Nainstalujeme knihovnu Mitogen:

pip install mitogen

Nyní existují dva rovnocenné způsoby – buď nastavit možnosti v konfiguračním souboru ansible.cfg, nebo nastavit potřebné proměnné prostředí.

Předpokládejme, že cesta k nainstalovanému Mitogen bude /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Potom:

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

nebo

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

Nainstalujeme Ansible v prostředí virtualenv, s Mitogen i bez něj:

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

Všimněte si, že Mitogen 0.2.7 nefunguje s Ansible 2.8 (k mému k květnu 2019)

Vytvoříme 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'

Teď se pokusíme spustit playbook, který vytváří soubory na vzdáleném stroji:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Vytvořit soubory s modulem copy
      copy:
        content: |
          testovací soubor {{ item }}
        dest: ~\/file_{{ item }}
      with_sequence: start=1 end={{ n }}

A spustíme s Mitogen i bez něj pro vytvoření 10 souborů:

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

Vidíme zlepšení o 2x. Zkusme to pro 20, 30, …, 100 souborů:

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

Nakonec jsme zrychlili vykonávání více než 10krát!
Teď zkusíme různé scénáře a uvidíme, jak mnohem rychleji to funguje:

  • Scénář kopírování souborů na vzdálený host z místního (s modulem smazat):
    Zrychlení Ansible pomocí Mitogen

  • Scénář vytváření souborů na vzdáleném hostu s smazat modulem:
    Zrychlení Ansible pomocí Mitogen

  • Scénář stahování souborů z vzdáleného hosta na místní:
    Zrychlení Ansible pomocí Mitogen

Zkusíme scénář se třemi (3) vzdálenými stroji, například scénář s kopírováním souborů na vzdálený host:
Zrychlení Ansible pomocí Mitogen

Jak je vidět, Mitogen nám šetří jak čas, tak i provoz v těchto scénářích. Ale pokud je „úzké hrdlo“ nikoli v Ansible, ale například v I/O disku nebo síti, pak je těžké očekávat, že by nám Mitogen pomohl.

Zkusme scénář s instalací balíčků pomocí yum\/dnf a modulů Python pomocí pip. Balíčky byly vyrovnány, aby nespoléhali na chyby v síti:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Nainstalovat balíčky
      become: true
      package:
        name:
          - samba
          - httpd
          - nano
          - ruby
        state: present

    - name: Nainstalovat pip moduly
      become: true
      pip:
        name:
          - pytest-split-tests
          - bottle
          - pep8
          - flask
        state: present

S Mitogen to trvalo 12 sekund, stejně jako bez něj.
Na stránce Mitogen pro Ansible stránka můžete si prohlédnout další benchmarky a testy. Jak se uvádí na stránce:

Mitogen nemůže zrychlit modul, když je vykonáván. Může pouze učinit vykonání tohoto modulu co nejrychlejším.

Proto je důležité najít vaše úzká místa ve nasazení, a pokud jsou způsobena Ansible, Mitogen vám pomůže je vyřešit a výrazně zrychlit vykonávání vašich playbooků.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster