Ansible + булуттагы виртуалдык машиналардын кластерин автоматтык түрдө тартуу

Ansible + булуттагы виртуалдык машиналардын кластерин автоматтык түрдө тартуу

Кайырдуу күн

Бизде ар биринде көп сандагы виртуалдык машиналары бар бир нече булут кластерлери бар. Биз бул бизнести Hetznerде өткөрөбүз. Ар бир кластерде бизде бирден башкы машина бар, андан сүрөт тартылып, кластердин ичиндеги бардык виртуалдык машиналарга автоматтык түрдө бөлүштүрүлөт.

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

Бул, балким, мыкты практика эмес, бирок бул чечим мүмкүн болушунча ыңгайлуу жана жөнөкөй көрүндү.

Үйрөткүч үчүн мышыкты караңыз.

Башкы машинада талап кылынган пакеттер:

  • код
  • Мурунку
  • ssh баскычтары менен файл

Бардык виртуалдык машиналарга автоматтык ичеги тартууну ишке ашыруунун жалпы принциби - сизге Ansible орнотула турган машина керек. Бул машинадан ansible git pull буйруктарын жөнөтөт жана жаңыртылган кызматты кайра иштетет. Бул максаттар үчүн биз кластерлерден тышкары өзүнчө виртуалдык машинаны түзүп, ага орноттук:

  • код
  • түшүнүктүү
  • gitlab-runner

Уюштуруу маселелеринен - ​​gitlab-runnerти каттап, ssh-keygen жасап, бул машинанын жалпыга ачык ssh ачкычын жүктөө керек. .ssh/authorized_keys башкы машинада, башкы машинада ansible үчүн 22-портту ачыңыз.

Эми ansible конфигурациялайлы

Анткени биздин максатыбыз мүмкүн болгон нерселердин баарын автоматташтыруу. Файлда /etc/ansible/ansible.cfg биз линияны жокко чыгарабыз host_key_checking = Falseансибл жаңы машиналарды ырастоону суранбашы үчүн.

Андан кийин, сиз автоматтык түрдө ansible үчүн инвентаризация файлын түзүшүңүз керек, ал жерден git pull жасашыңыз керек болгон машиналардын IP-сын алат.

Бул файлды Hetzner's 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ге кабык модулун колдонууну айт
  • -а - бул аргумент. Бул жерге каалаган буйрукту киргизсе болот
  • топ — кластериңиздин аты. Эгер муну бардык кластерлерде жасашыңыз керек болсо, топту бардыгына өзгөртүңүз

Келгиле, андан ары баралы - виртуалдык машиналарыбызда 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 буйруктары аткарыла турган кластердин атын өзгөртүшүңүз керек.

Source: www.habr.com

Комментарий кошуу