روز خوب
ما چندین خوشه ابری داریم که در هر کدام تعداد زیادی ماشین مجازی وجود دارد. ما میزبان کل این تجارت در Hetzner هستیم. در هر خوشه یک ماشین اصلی داریم، یک عکس فوری از آن گرفته می شود و به طور خودکار در تمام ماشین های مجازی درون خوشه توزیع می شود.
این طرح به ما اجازه نمی دهد که از gitlab-runner ها به طور معمول استفاده کنیم، زیرا مشکلات زیادی با ظاهر شدن تعداد زیادی رانر ثبت شده مشابه ایجاد می شود، که ما را بر آن داشت تا راه حلی پیدا کنیم و این مقاله/راهنما را بنویسیم.
این احتمالا بهترین عمل نیست، اما این راه حل تا حد امکان راحت و ساده به نظر می رسید.
برای آموزش لطفا گربه را ببینید.
بسته های مورد نیاز در ماشین اصلی:
- پایتون
- دستگاه گوارش
- فایل با کلیدهای ssh
اصل کلی اجرای gut pull خودکار در تمام ماشین های مجازی این است که شما به ماشینی نیاز دارید که Ansible روی آن نصب شود. از این دستگاه، ansible دستورات git pull را ارسال می کند و سرویس به روز شده را مجددا راه اندازی می کند. برای این منظور، ما یک ماشین مجازی مجزا در خارج از کلاسترها ایجاد کردیم و روی آن نصب کردیم:
- پایتون
- ansible
- gitlab-runner
از مسائل سازمانی - باید gitlab-runner را ثبت کنید، ssh-keygen بسازید، کلید ssh عمومی این دستگاه را آپلود کنید .ssh/authorized_keys
در ماشین اصلی، پورت 22 را برای ansible در ماشین اصلی باز کنید.
حالا بیایید ansible را پیکربندی کنیم
از آنجایی که هدف ما خودکار کردن هر چیزی است که ممکن است. در پرونده /etc/ansible/ansible.cfg
ما خط را لغو نظر خواهیم کرد host_key_checking = False
به طوری که ansible برای تایید ماشین های جدید درخواست نمی کند.
در مرحله بعد، باید به طور خودکار یک فایل موجودی برای ansible ایجاد کنید، از آنجا آی پی ماشین هایی که باید git pull را روی آن ها انجام دهید، می گیرد.
ما این فایل را با استفاده از API Hetzner تولید می کنیم، می توانید لیست هاست ها را از پایگاه داده AWS، Asure خود بردارید (در جایی برای نمایش ماشین های در حال اجرا خود یک API دارید، درست است؟).
ساختار فایل موجودی برای Ansible بسیار مهم است، باید به شکل زیر باشد:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
برای تولید چنین فایلی، یک اسکریپت ساده می سازیم (بیایید آن را صدا کنیم 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 - لیستی از ماشین ها را ایجاد کنید
- -i - مسیر مطلق به فایل موجودی
- -m - به ansible بگویید از ماژول پوسته استفاده کند
- -a استدلال است. هر دستوری را می توان در اینجا وارد کرد
- گروه - نام خوشه شما. اگر لازم است این کار را روی همه خوشه ها انجام دهید، گروه را به همه تغییر دهید
بیایید جلوتر برویم - بیایید سعی کنیم git pull را در ماشین های مجازی خود انجام دهیم:
/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 روی آن اجرا می شود را تغییر دهید.
منبع: www.habr.com