Ansible + auto git pull нь үүлэн доторх виртуал машинуудын бөөгнөрөл юм

Ansible + auto git pull нь үүлэн доторх виртуал машинуудын бөөгнөрөл юм

Сайхан өдөр

Бидэнд олон тооны виртуал машин бүхий хэд хэдэн үүл кластерууд байдаг. Бид энэ бүх бизнесийг Hetzner-д зохион байгуулдаг. Кластер бүрт бид нэг мастер машинтай бөгөөд үүнээс хормын хувилбарыг авч кластер доторх бүх виртуал машинд автоматаар түгээдэг.

Энэ схем нь gitlab-runners-ийг ердийн байдлаар ашиглахыг зөвшөөрдөггүй, учир нь олон ижил бүртгэлтэй гүйгч гарч ирэхэд маш олон асуудал гарч ирдэг бөгөөд энэ нь биднийг тойрон гарах арга замыг хайж, энэ нийтлэл/гарын авлагыг бичихэд хүргэсэн.

Энэ нь магадгүй хамгийн сайн туршлага биш боловч энэ шийдэл нь аль болох тохиромжтой, энгийн мэт санагдсан.

Сургалтын талаар муурыг үзнэ үү.

Мастер машин дээр шаардлагатай багцууд:

  • Python
  • Go
  • ssh товчлуур бүхий файл

Бүх виртуал машин дээр гэдэсний автомат таталтыг хэрэгжүүлэх ерөнхий зарчим бол танд Ansible суулгасан машин хэрэгтэй болно. Энэ машинаас ansible нь git pull командуудыг илгээж, шинэчлэгдсэн үйлчилгээг дахин эхлүүлэх болно. Эдгээр зорилгын үүднээс бид кластеруудын гадна тусдаа виртуал машин үүсгэж, түүн дээр суулгасан.

  • Python
  • ойлгомжгүй
  • gitlab-гүйгч

Зохион байгуулалтын асуудлаас - та gitlab-runner-ийг бүртгүүлэх, ssh-keygen хийх, энэ машины нийтийн ssh түлхүүрийг байршуулах хэрэгтэй. .ssh/authorized_keys Мастер машин дээр 22-р портыг мастер машин дээр нээнэ үү.

Одоо ansible тохиргоогоо хийцгээе

Учир нь бидний зорилго бол боломжтой бүх зүйлийг автоматжуулах явдал юм. Файлд /etc/ansible/ansible.cfg Бид мөрийн тайлбарыг арилгана host_key_checking = FalseИнгэснээр ansible шинэ машинуудыг баталгаажуулахыг шаарддаггүй.

Дараа нь та ansible-д зориулж бараа материалын файлыг автоматаар үүсгэх хэрэгтэй бөгөөд тэндээс git pull хийх шаардлагатай машинуудын IP хаягийг авах болно.

Бид энэ файлыг Hetzner-ийн API ашиглан үүсгэдэг. Та өөрийн 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 

Хэрэв гаралт дээр бид аль хэдийн шинэчлэгдсэн эсвэл репозитороос буулгаж байгааг харж байгаа бол бүх зүйл ажиллаж байна.

Одоо энэ бүхэн үүнд зориулагдсан байв

Гитлаб дахь мастер салбар руу орохдоо скриптээ автоматаар ажиллуулахыг заацгаая

Эхлээд скриптээ илүү гоё болгож, гүйцэтгэх боломжтой файлд оруулъя (үүнийг 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

сэтгэгдэл нэмэх