Ansible + auto git سحب في كتلة الجهاز الظاهري في السحابة



يوم جيد


لدينا العديد من مجموعات السحابة مع عدد كبير من الأجهزة الافتراضية في كل منها. يتم استضافة كل هذه الأعمال في Hetzner'e. في كل مجموعة ، لدينا آلة رئيسية واحدة ، يتم أخذ لقطة منها وتوزيعها تلقائيًا على جميع الأجهزة الافتراضية داخل المجموعة.

هذا المخطط لا يسمح لنا باستخدام المتسابقين gitlab بشكل طبيعي ، حيث تنشأ الكثير من المشاكل عند ظهور العديد من المتسابقين المسجلين المتطابقين ، مما دفعنا إلى إيجاد حل بديل وكتابة هذه المقالة / الدليل.

قد لا تكون هذه هي أفضل الممارسات ، ولكن يبدو أن هذا الحل مناسب وبسيط قدر الإمكان.

بالنسبة للبرنامج التعليمي ، أطلب قطة.

الحزم المطلوبة على الجهاز الرئيسي:

  • الثعبان
  • بوابة
  • ملف مع مفاتيح سه

يتمثل المبدأ العام لتطبيق السحب التلقائي على جميع الأجهزة الافتراضية في أنك بحاجة إلى جهاز سيتم تثبيت Ansible عليه. من هذا الجهاز ، سيرسل ansible أوامر git pull ويعيد تشغيل الخدمة التي تم تحديثها. لقد أنشأنا آلة افتراضية منفصلة خارج الكتل لهذه الأغراض ، وقمنا بتثبيتها على:

  • الثعبان
  • ansible
  • gitlab حظا

من المشكلات التنظيمية - تحتاج إلى تسجيل gitlab-runner ، وجعل ssh-keygen ، وإسقاط المفتاح ssh العام لهذا الجهاز في .ssh/authorized_keys على الجهاز الرئيسي ، افتح المنفذ 22 للحصول على ansible على الجهاز الرئيسي.

الآن تكوين ansible


لأن هدفنا هو أتمتة كل ما هو ممكن. في الملف /etc/ansible/ansible.cfg host_key_checking = False خط host_key_checking = False حتى لا يطلب ansible تأكيد الأجهزة الجديدة.

بعد ذلك ، ستحتاج إلى إنشاء ملف جرد تلقائيًا من أجل ansible ، حيث ستلتقط أجهزة IP التي تحتاج إلى القيام بها.

نقوم بإنشاء هذا الملف باستخدام واجهة برمجة تطبيقات Hetzner ، ولكن يمكنك أن تأخذ قائمة المضيفين من قاعدة بيانات AWS ، Asure ، (لديك واجهة برمجة تطبيقات في مكان ما لعرض الأجهزة قيد التشغيل ، أليس كذلك؟).

هيكل ملف الجرد مهم للغاية لـ Ansible ، يجب أن يكون مظهره كما يلي:

 [] ip- ip- [2] ip- ip- 


لإنشاء مثل هذا الملف ، vm_list نصًا بسيطًا (دعنا نسميه vm_list ):

 #!/bin/bash echo [group] > /etc/ansible/cloud_ip && " CLI    IP    " >> /etc/ansible/cloud_ip echo " " >> /etc/ansible/cloud_ip echo [group2] > /etc/ansible/cloud_ip && " CLI    IP     " >> /etc/ansible/cloud_ip 

حان الوقت للتحقق من أن ansible يعمل وأصدقاء مع مستلم عناوين IP:

 /etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group 

يجب أن يتلقى الإخراج أسماء الأجهزة المضيفة التي تم تنفيذ الأمر عليها.
بضع كلمات عن بناء الجملة:

  • /etc/ansible/./vm_list - إنشاء قائمة بالأجهزة
  • - أنا - المسار المطلق إلى ملف المخزون
  • -m - أخبر ansible لاستخدام وحدة قذيفة
  • واحد حجة. يمكن إدخال أي فريق هنا.
  • المجموعة هي اسم الكتلة الخاصة بك. إذا كنت بحاجة إلى القيام بكل المجموعات ، فقم بتغيير المجموعة إلى الكل

المضي قدمًا - حاول القيام بجذب الأجهزة الخاصة بنا:

 /etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

إذا رأينا محدثًا بالفعل أو تم تفريغه من المستودع في الإخراج ، فسيعمل كل شيء.

الآن ما كان المقصود به كل شيء


نحن نعلم أن يتم تنفيذ البرنامج النصي لدينا تلقائيًا عند الالتزام في الفرع الرئيسي في gitlab

أولاً ، سنجعل النص البرمجي أكثر جمالا ونضعه في ملف قابل للتنفيذ (دعنا نسميه exec_pull) -

 #!/bin/bash /etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@" 

نذهب إلى gitlab وفي المشروع نقوم بإنشاء الملف .gitlab-ci.yml
داخل نضع ما يلي:

 variables: GIT_STRATEGY: none VM_GROUP: group stages: - pull - restart run_exec_pull: stage: pull script: - /etc/ansible/exec_pull 'cd /path/to/project/'$CI_PROJECT_NAME' && git pull' $VM_GROUP only: - master run_service_restart: stage: restart script: - /etc/ansible/exec_pull 'your_app_stop && your_app_start' $VM_GROUP only: - master 

كل شيء جاهز. الآن -

  • جعل ارتكاب
  • نفرح أن كل شيء يعمل

عند نقل .yml إلى مشاريع أخرى ، تحتاج فقط إلى تغيير اسم الخدمة لإعادة التشغيل واسم الكتلة التي سيتم تنفيذ أوامر ansible عليها.

Source: https://habr.com/ru/post/ar472064/


All Articles