Ansible versnellen met Mitogen

Ansible werd een van de meest populaire Systeemconfiguratiebeheer. Na werd gekocht door Red Hat in 2015 het aantal deelnemers aan projecten overtrof duizenden en Ansible werd waarschijnlijk het meest gebruikte implementatie- en orkestratiesysteem. Het brede scala aan toepassingen is zeer indrukwekkend.

Ansible werkt via SSH-verbindingen met 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 wordt dit bestand op de externe machine uitgevoerd. Deze hele reeks bewerkingen is behoorlijk lang en vervelend, dus er zijn verschillende manieren om deze te optimaliseren.

Eén van deze manieren is SSH-pijpleidingen waarmee u één SSH-sessie kunt gebruiken om instructies uit te voeren, in plaats van elke keer een nieuwe sessie te openen, wat ons veel tijd kan besparen. (Vergeet niet om uit te schakelen requiretty instelling voor sudo in je /etc/sudoers bestand op de externe machine)

Een nieuwe manier om Ansible te overklokken is een Python-bibliotheek genaamd mitogeen. Als iemand er nog nooit van heeft gehoord, zal ik de functionaliteit ervan kort beschrijven. Het maakt een snelle uitvoering van Python-code op een externe machine mogelijk, en Ansible is slechts een voorbeeld van gebruik. Mitogen gebruikt een UNIX-pipe op de externe machine en brengt Python-code over, gecomprimeerd met zlib en geserialiseerd met pickle. Dit helpt om het sneller te voltooien en bespaart verkeer. Als u geïnteresseerd bent in een uitgebreidere uitleg, kunt u dit het beste op de pagina lezen "Hoe het werkt". Maar vandaag zullen we ons alleen concentreren op hoe de bibliotheek met Ansible werkt.

Mitogen kan onder bepaalde omstandigheden uw Ansible-code meerdere keren versnellen en het verkeersverbruik aanzienlijk verminderen. Laten we eens kijken naar de meest populaire gebruiksscenario's en kijken hoeveel het ons helpt.

Ik gebruik Ansible het meest voor: het maken van configuratiebestanden op een externe machine, het installeren van pakketten, het kopiëren van bestanden van en naar de externe machine. Misschien heb je andere voorbeelden - schrijf in de reacties.

Laten we gaan!

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

pip install mitogen

Nu zijn er twee gelijkwaardige manieren: configureer de opties in het configuratiebestand ansible.cfg of stel de benodigde omgevingsvariabelen in.

Laten we aannemen dat het pad naar de geïnstalleerde Mitogen er zal zijn /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 in virtualenv installeren, 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

Houd er rekening mee dat Mitogen 0.2.7 niet werkt met Ansible 2.8 (vanaf mei 2019)

Aliassen maken:

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 draaiboek uit te voeren dat bestanden op een externe machine maakt:

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

En laten we het met en zonder Mitogen uitvoeren om 10 bestanden te maken:

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 tweevoudige verbetering. Laten we 2, 20, ..., 30 bestanden controleren:

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

Als gevolg hiervan hebben we de uitvoering met meer dan 10 keer versneld!
Laten we nu verschillende scenario's proberen en zien hoeveel sneller alles voor ons werkt:

  • Script voor het kopiëren van bestanden naar een externe host vanaf een lokale host (met de module copy):
    Ansible versnellen met Mitogen

  • Script voor het maken van bestanden op een externe host met copy module:
    Ansible versnellen met Mitogen

  • Scenario met het downloaden van bestanden van een externe host naar een lokale host:
    Ansible versnellen met Mitogen

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

Zoals u kunt zien, bespaart Mitogen ons in deze scenario's zowel tijd als verkeer. Maar als het knelpunt niet in Ansible zit, maar bijvoorbeeld in de I/O van een schijf of netwerk, of ergens anders, dan is het moeilijk te verwachten dat Mitogen ons zal helpen.

Laten we een script proberen met het installeren van pakketten met yum/dnf- en python-modules met behulp van pip. De pakketten zijn in de cache opgeslagen om niet afhankelijk te zijn van netwerkstoringen:

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

Met Mitogen duurde het 12 seconden, hetzelfde als zonder.
Op de pagina Mitogen voor Ansible-pagina je kunt naar andere benchmarks en tests kijken. Zoals op de pagina staat:

Mitogen kan de module niet versnellen wanneer deze actief is. Het kan de uitvoering van deze module alleen zo snel mogelijk maken.

Daarom is het belangrijk om uw knelpunten in uw implementatie te vinden en als deze te wijten zijn aan Ansible, dan zal Mitogen u helpen deze op te lossen en de uitvoering van uw draaiboeken aanzienlijk te versnellen.

Bron: www.habr.com

Voeg een reactie