Xayrli kun
Bizda har birida ko'p sonli virtual mashinalarga ega bo'lgan bir nechta bulutli klasterlar mavjud. Biz butun biznesni Hetznerda o'tkazamiz. Har bir klasterda bizda bitta asosiy mashina bor, undan surat olinadi va avtomatik ravishda klaster ichidagi barcha virtual mashinalarga tarqatiladi.
Ushbu sxema bizga gitlab-runners-dan normal foydalanishga ruxsat bermaydi, chunki ko'plab bir xil ro'yxatdan o'tgan yuguruvchilar paydo bo'lganda ko'plab muammolar paydo bo'ladi, bu bizni vaqtinchalik echim topishga va ushbu maqola/qo'llanmani yozishga undadi.
Bu, ehtimol, eng yaxshi amaliyot emas, lekin bu yechim imkon qadar qulay va sodda tuyuldi.
Qo'llanma uchun mushukni ko'ring.
Asosiy mashinada kerakli paketlar:
- python
- borish
- ssh kalitlari bilan fayl
Barcha virtual mashinalarda avtomatik tortishni amalga oshirishning umumiy printsipi shundaki, sizga Ansible o'rnatiladigan mashina kerak bo'ladi. Ushbu mashinadan ansible git pull buyruqlarini yuboradi va yangilangan xizmatni qayta ishga tushiradi. Ushbu maqsadlar uchun biz klasterlardan tashqarida alohida virtual mashina yaratdik va unga o'rnatdik:
- python
- sezilmaydigan
- gitlab-runner
Tashkiliy masalalardan - siz gitlab-runner-ni ro'yxatdan o'tkazishingiz, ssh-keygen yaratishingiz, ushbu mashinaning umumiy ssh kalitini yuklashingiz kerak. .ssh/authorized_keys
asosiy mashinada, asosiy mashinada ansible uchun 22-portni oching.
Endi ansibleni sozlaymiz
Chunki bizning maqsadimiz mumkin bo'lgan hamma narsani avtomatlashtirishdir. Fayl ichida /etc/ansible/ansible.cfg
qatorni izohdan chiqaramiz host_key_checking = False
Shunday qilib, ansible yangi mashinalarni tasdiqlashni so'ramaydi.
Keyinchalik, siz avtomatik ravishda ansible uchun inventar faylini yaratishingiz kerak, u erdan siz git pull qilishingiz kerak bo'lgan mashinalarning IP-ni oladi.
Biz ushbu faylni Hetzner's API yordamida yaratamiz, siz AWS, Asure, ma'lumotlar bazasidan xostlar ro'yxatini olishingiz mumkin (sizda ishlaydigan mashinalaringizni ko'rsatish uchun API mavjud, to'g'rimi?).
Inventar faylining tuzilishi Ansible uchun juda muhim, u quyidagicha ko'rinishi kerak:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Bunday faylni yaratish uchun biz oddiy skript tuzamiz (uni chaqiramiz 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 ishlayotganini va IP manzillarini qabul qilish bilan do'stona ekanligini tekshirish vaqti keldi:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Chiqishda buyruq bajarilgan mashinalarning xost nomlari bo'lishi kerak.
Sintaksis haqida bir necha so'z:
- /etc/ansible/./vm_list - mashinalar ro'yxatini yaratish
- -i - inventar fayliga mutlaq yo'l
- -m - ansible-ga qobiq modulidan foydalanishni ayting
- -a - argument. Bu yerda istalgan buyruqni kiritish mumkin
- guruh — klasteringiz nomi. Agar buni barcha klasterlarda qilishingiz kerak bo'lsa, guruhni hammaga o'zgartiring
Keling, oldinga boraylik - virtual mashinalarimizda git pull ni bajarishga harakat qilaylik:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Agar chiqishda biz allaqachon yangilangan yoki ombordan tushirishni ko'rsak, unda hamma narsa ishlaydi.
Endi bularning barchasi nima uchun mo'ljallangan edi
Skriptimizni gitlab-dagi master filialiga kirishda avtomatik ravishda ishga tushirishni o'rgataylik
Birinchidan, keling, skriptimizni yanada chiroyli qilib, uni bajariladigan faylga joylashtiramiz (keling, uni exec_pull deb ataymiz) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Keling, bizning gitlab-ga o'tamiz va loyihada fayl yaratamiz .gitlab-ci.yml
Biz quyidagilarni ichkariga joylashtiramiz:
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
Hammasi tayyor. Endi -
- va'da qilish
- Hammasi ishlayotganidan xursandman
.yml-ni boshqa loyihalarga o'tkazishda siz faqat qayta ishga tushirish uchun xizmat nomini va mos keladigan buyruqlar bajariladigan klaster nomini o'zgartirishingiz kerak.
Manba: www.habr.com