Bulutdagi virtual mashinalar klasterida Ansible + auto git pull

Bulutdagi virtual mashinalar klasterida Ansible + auto git pull

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 = FalseShunday 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

a Izoh qo'shish