
يوم جيد
لدينا العديد من مجموعات السحابة مع عدد كبير من الأجهزة الافتراضية في كل منها. يتم استضافة كل هذه الأعمال في Hetzner'e. في كل مجموعة ، لدينا آلة رئيسية واحدة ، يتم أخذ لقطة منها وتوزيعها تلقائيًا على جميع الأجهزة الافتراضية داخل المجموعة.
هذا المخطط لا يسمح لنا باستخدام المتسابقين gitlab بشكل طبيعي ، حيث تنشأ الكثير من المشاكل عند ظهور العديد من المتسابقين المسجلين المتطابقين ، مما دفعنا إلى إيجاد حل بديل وكتابة هذه المقالة / الدليل.
قد لا تكون هذه هي أفضل الممارسات ، ولكن يبدو أن هذا الحل مناسب وبسيط قدر الإمكان.
بالنسبة للبرنامج التعليمي ، أطلب قطة.
الحزم المطلوبة على الجهاز الرئيسي:- الثعبان
- بوابة
- ملف مع مفاتيح سه
يتمثل المبدأ العام لتطبيق السحب التلقائي على جميع الأجهزة الافتراضية في أنك بحاجة إلى جهاز سيتم تثبيت Ansible عليه. من هذا الجهاز ، سيرسل ansible أوامر git pull ويعيد تشغيل الخدمة التي تم تحديثها. لقد أنشأنا آلة افتراضية منفصلة خارج الكتل لهذه الأغراض ، وقمنا بتثبيتها على:
من المشكلات التنظيمية - تحتاج إلى تسجيل 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
):
حان الوقت للتحقق من أن 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) -
نذهب إلى 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 عليها.