Accelereren van Ansible met Mitogen

Ansible is een van de populairste Configuration Management-systemen. Nadat het in 2015 door Red Hat werd overgenomen is het aantal projectdeelnemers gestegen tot duizenden en Ansible is waarschijnlijk het meest gebruikte systeem voor implementatie en orkestratie geworden. De brede toepassingsgebieden zijn zeer indrukwekkend.

Ansible werkt via SSH-verbindingen naar externe hosts. Het opent een SSH-sessie, logt in, kopieert de Python-code over het netwerk en schrijft deze naar een apart tijdelijk bestand. Daarna voert het dit bestand uit op de externe machine. Deze reeks bewerkingen is vrij lang en saai, daarom zijn er verschillende manieren om deze te optimaliseren.

Een van deze manieren is SSH-pijpleidingen die het mogelijk maakt om ƩƩn SSH-sessie te gebruiken voor het uitvoeren van instructies, in plaats van telkens een nieuwe sessie te openen, wat ons veel tijd kan besparen. (Vergeet alleen niet om de requiretty instelling voor sudo in uw /etc/sudoers bestand op de externe machine uit te schakelen)

Een nieuwe manier om Ansible te 'versnellen' is de Python-bibliotheek genaamd Mitogen. Mocht iemand er nog niet van gehoord hebben — ik zal kort de functionaliteit beschrijven. Het stelt u in staat om Python-code snel uit te voeren op een externe machine en Ansible is slechts ƩƩn van de voorbeelden van gebruik. Mitogen gebruikt UNIX-pipes op de externe machine en verzendt de Python-code gecomprimeerd met zlib en geserialiseerd met pickle. Dit helpt om het sneller uit te voeren en bespaart verkeer. Als u geĆÆnteresseerd bent in een meer gedetailleerde uitleg, kunt u het beste deze lezen op de pagina ā€˜Hoe het werkt’. Maar vandaag focussen we ons alleen op het gebruik van de bibliotheek met Ansible.

Mitogen kan onder bepaalde omstandigheden uw Ansible-code meerdere keren versnellen en het verkeer aanzienlijk verminderen. Laten we de meest populaire voorbeelden van gebruik bekijken en zien hoeveel dit ons helpt.

Ik gebruik Ansible het meest voor: het creĆ«ren van configuratiebestanden op een externe machine, het installeren van pakketten, bestanden naar de externe machine kopiĆ«ren en vice versa. Misschien heeft u andere voorbeelden — laat het ons weten in de reacties.

Laten we beginnen!

De configuratie van Mitogen voor Ansible is heel eenvoudig:
Installeer de Mitogen-bibliotheek:

pip install mitogen

Er zijn nu twee gelijkwaardige manieren — ofwel de opties instellen in het configuratiebestand ansible.cfg, of de benodigde omgevingsvariabelen instellen.

Stel dat het pad naar het geĆÆnstalleerde Mitogen is /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy. Dan:

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

of

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

Laten we Ansible installeren in virtualenv, met en zonder 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

Let op dat Mitogen 0.2.7 niet werkt met Ansible 2.8 (in mei 2019)

Maak aliases:

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'

Laten we nu proberen een playbook uit te voeren dat bestanden op een externe machine aanmaakt:

---
- hosts: all
  gather_facts: false
  tasks:
    - name: Maak bestanden aan met de kopie-contentmodule
      copy:
        content: |
          test bestand {{ item }}
        dest: ~/bestand_{{ item }}
      with_sequence: start=1 end={{ n }}

En laten we het uitvoeren met en zonder Mitogen voor het aanmaken van 10 bestanden:

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

We zien een verbetering van 2 keer. Laten we het controleren voor 20, 30, ..., 100 bestanden:

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

Uiteindelijk hebben we de uitvoering meer dan 10 keer versneld!
Laten we nu verschillende scenario's proberen en zien hoe snel alles werkt:

  • Scenario voor het kopiĆ«ren van bestanden naar een externe host vanaf lokaal (met de module copy):
    Accelereren van Ansible met Mitogen

  • Scenario voor het aanmaken van bestanden op een externe host met copy module:
    Accelereren van Ansible met Mitogen

  • Scenario voor het downloaden van bestanden van een externe host naar lokaal:
    Accelereren van Ansible met Mitogen

Laten we een scenario proberen met meerdere (3) externe machines, bijvoorbeeld een scenario voor het kopiƫren van bestanden naar een externe host:
Accelereren van Ansible met Mitogen

Zoals te zien is, bespaart Mitogen ons zowel tijd als bandbreedte in deze scenario's. Maar als de 'bottleneck' niet in Ansible zit, maar bijvoorbeeld in de I/O van de schijf of het netwerk, of ergens anders, dan is het moeilijk te verwachten dat Mitogen ons helpt.

Laten we een scenario proberen met het installeren van pakketten met yum/dnf en Python-modules met pip. De pakketten zijn gecached om niet afhankelijk te zijn van netwerkproblemen:

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

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

Met Mitogen duurde dit 12 seconden, net als zonder.
Op de pagina Mitogen voor Ansible pagina u kunt andere benchmarks en tests bekijken. Zoals vermeld op de pagina:

Mitogen kan een module niet versnellen wanneer deze wordt uitgevoerd. Het kan alleen de uitvoering van deze module zo snel mogelijk maken.

Daarom is het belangrijk om uw knelpunten bij de implementatie te vinden, en als deze door Ansible komen, kan Mitogen u helpen ze op te lossen en de uitvoering van uw playbooks aanzienlijk te versnellen.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster