تسريع Ansible مع Mitogen!
→ النسخة الروسية
Ansible هي واحدة من أنظمة إدارة التكوين الأكثر شعبية في الوقت الحاضر. بعد أن اشترتها Red Hat في عام 2015 ، وصلت Ansible إلى أعداد الآلاف من المساهمين وأصبحت ربما واحدة من أكثر أدوات النشر والتنسيق استخدامًا. حالات الاستخدام لها مؤثرة جدا.
Ansible يعمل عن طريق اتصالات SSH إلى المضيفين عن بعد. يفتح جلسة SSH ، ويسجل الدخول إلى shell ، ونسخ رمز بيثون عبر الشبكة وإنشاء ملف مؤقت على المضيفين عن بعد مع هذا الرمز. في الخطوة التالية ، يتم تنفيذ الملف الحالي باستخدام مترجم python. كل سير العمل هذا ثقيل للغاية وهناك طرق متعددة لجعله أسرع وأخف وزناً.
إحدى هذه الطرق هي استخدام خطوط أنابيب SSH التي تعيد استخدام جلسة SSH واحدة لنسخ رمز python الخاص بمهام متعددة ومنع فتح جلسات متعددة ، مما يوفر الكثير من الوقت. (فقط لا تنسَ تعطيل إعدادات requiretty
لـ sudo على الجانب البعيد في /etc/sudoers
)
الطريقة الجديدة لتسريع Ansible هي مكتبة بيثون عظيمة تسمى Mitogen . إذا لم يكن شخص مثلي على دراية به - فهذه المكتبة تسمح بالتنفيذ السريع لرمز الثعبان على مضيف بعيد وأن Ansible ليست سوى واحدة من حالاتها. يستخدم Mitogen أنابيب UNIX على الأجهزة البعيدة أثناء تمرير رمز الثعبان "المخلل" المضغوط مع zlib. هذا يسمح بتشغيله بسرعة ودون الكثير من الحركة. إذا كنت مهتمًا ، يمكنك قراءة التفاصيل حول كيفية عملها في صفحة "كيف تعمل" . لكننا سنركز اليوم على جزء Ansible ذي الصلة منه.
ميتوجين في ظروف معينة يمكن أن يسرع Ansible الخاص بك في عدة مرات ويقلل بشكل كبير من عرض النطاق الترددي الخاص بك. دعونا نتحقق من أكثر حالات الاستخدام شيوعًا ومعرفة ما إذا كان ذلك مفيدًا لنا.
حالات الاستخدام الأكثر شيوعًا بالنسبة لي لتشغيل Ansible هي: إنشاء ملفات التكوين على مضيف بعيد ، تثبيت الحزم ، تنزيل الملفات وتحميلها من وإلى مضيف بعيد. ربما تريد التحقق من حالات الاستخدام الأخرى ، يرجى ترك تعليقات على هذه المقالة.
لنبدأ المتداول!
تكوين Mitogen لـ Ansible بسيط جدًا:
تثبيت وحدة Mitogen:
pip install mitogen
ثم إما تكوين متغيرات البيئة أو تعيين خيارات التكوين في ملف ansible.cfg ، كلا الخيارين بخير:
لنفترض أن /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
هو طريقك إلى تثبيت مكتبة Mitogen.
export ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy export ANSIBLE_STRATEGY=mitogen_linear
أو
[defaults] strategy = mitogen_linear strategy_plugins = /usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy
تحضير Ansible في virtualenv ، مع وبدون تمكين 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
يرجى الانتباه إلى أن Mitogen 0.2.7 لا يعمل مع Ansible 2.8 (لشهر مايو 2019)
إنشاء أسماء مستعارة:
alias pure-ansible-playbook='$(pwd)/pure_ansible/bin/ansible-playbook' alias mitogen-ansible-playbook='ANSIBLE_STRATEGY_PLUGINS=/usr/lib/python2.7/site-packages/ansible_mitogen/plugins/strategy:$(pwd)/mitogen_ansible/lib/python3.7/site-packages/ansible_mitogen/plugins/strategy ANSIBLE_STRATEGY=mitogen_linear $(pwd)/mitogen_ansible/bin/ansible-playbook'
الآن دعونا نجرب قواعد اللعبة التي تنشئ ملفًا على جهاز التحكم عن بُعد:
--- - 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 }}
وقم بتشغيله باستخدام Mitogen وبدون إنشاء 10 ملفات:
time mitogen-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m2.603s user 0m1.152s sys 0m0.096s time pure-ansible-playbook file_creation.yml -i hosts -en=10 &>/dev/null real 0m5.908s user 0m1.745s sys 0m0.643s
الآن نرى تحسنا في أوقات x2. دعنا نتحقق من وجود 20 ، 30 ، ... ، 100 ملف:
time pure-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m51.775s user 0m8.039s sys 0m6.305s time mitogen-ansible-playbook file_creation.yml -i hosts -en=100 &>/dev/null real 0m4.331s user 0m1.903s sys 0m0.197s
في النهاية ، قمنا بتحسين وقت التنفيذ في أكثر من 10 مرات!
الآن لنجرب سيناريوهات مختلفة ونرى كيف تتحسن:
سيناريو تحميل الملفات من المضيف المحلي إلى البعيد (مع وحدة copy
):

سيناريو إنشاء ملفات على المضيف البعيد باستخدام وحدة copy
:

السيناريو مع جلب الملفات من المضيف البعيد إلى المحلي:

دعونا نجرب السيناريو الأخير على عدد قليل من (3) مضيفات بعيدة ، على سبيل المثال تحميل سيناريو الملفات:

كما يمكننا أن نرى Mitogen يوفر لنا الوقت وعرض النطاق الترددي في هذه السيناريوهات. ولكن إذا لم يكن عنق الزجاجة Ansible ، ولكن على سبيل المثال I / O من القرص أو الشبكة ، أو في أي مكان آخر ، فمن الصعب توقع ذلك من Mitogen للمساعدة بالطبع.
دعنا نعمل على سبيل المثال تثبيت الحزم مع تثبيت وحدات yum / dnf و python مع pip.
تم تخزين الحزم مؤقتًا مسبقًا لتجنب التبعيات على مواطن الخلل في الشبكة:
--- - 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
مع Mitogen يستغرق 12 ثانية ، وكذلك مع Ansible النقي.
في صفحة Mitogen for Ansible ، يمكنك رؤية معايير وقياسات إضافية. كما تعلن الصفحة:
لا يمكن لـ Mitogen تحسين الوحدة النمطية بمجرد تنفيذها ، بل يمكنها فقط ضمان تنفيذ الوحدة في أسرع وقت ممكن
لهذا السبب من المهم أن تجد مكان الاختناقات الخاصة بك ، وإذا كانت مرتبطة بعمليات Ansible ، فسوف تساعدك Mitogen على حلها وتسريع عمليات اللعب بشكل كبير.