Ansible + auto git pull дар як кластери мошинҳои виртуалӣ дар абр

Ansible + auto git pull дар як кластери мошинҳои виртуалӣ дар абр

Рӯзи нағз

Мо якчанд кластерҳои абрӣ дорем, ки дар ҳар як шумораи зиёди мошинҳои виртуалӣ доранд. Мо тамоми ин тиҷоратро дар Hetzner ҷойгир мекунем. Дар ҳар як кластер мо як мошини усто дорем, аз он аксбардорӣ гирифта мешавад ва ба таври худкор ба ҳамаи мошинҳои виртуалии дохили кластер тақсим карда мешавад.

Ин схема ба мо имкон намедиҳад, ки gitlab-runners-ро маъмулан истифода барем, зеро вақте ки бисёре аз давандагони якхелаи ба қайд гирифташуда пайдо мешаванд, мушкилоти зиёде ба миён меоянд, ки моро водор сохт, ки роҳи ҳалли худро пайдо кунем ва ин мақола/дастурро нависем.

Эҳтимол, ин таҷрибаи беҳтарин нест, аммо ин ҳалли он ба қадри имкон қулай ва содда менамуд.

Барои дарс, лутфан ба гурба нигаред.

Бастаҳои зарурӣ дар мошини асосӣ:

  • python
  • рафтан
  • файл бо калидҳои ssh

Принсипи умумии татбиқи автоматии кашидани рӯда дар ҳама мошинҳои виртуалӣ дар он аст, ки ба шумо мошине лозим аст, ки дар он Ansible насб карда мешавад. Аз ин мошин, ansible фармонҳои git pull мефиристад ва хидмати навсозӣшударо аз нав оғоз мекунад. Бо ин мақсадҳо, мо берун аз кластерҳо як мошини алоҳидаи виртуалӣ эҷод кардем ва дар он насб кардем:

  • python
  • иҷрошаванда
  • gitlab-давон

Аз масъалаҳои ташкилӣ - шумо бояд gitlab-runner-ро ба қайд гиред, ssh-keygen созед, калиди ssh-и оммавии ин мошинро бор кунед .ssh/authorized_keys дар мошини усто, кушода бандар 22 барои ansible дар мошини усто.

Акнун биёед ansible-ро танзим кунем

Азбаски ҳадафи мо автоматӣ кардани ҳама чизи имконпазир аст. Дар файл /etc/ansible/ansible.cfg мо хатро шарҳ медиҳем host_key_checking = Falseто ки ансибл тасдики машинахои навро талаб накунад.

Баъдан, шумо бояд ба таври худкор файли инвентаризатсияро барои ansible эҷод кунед, ки аз он ҷо IP-и мошинҳоеро мегирад, ки шумо бояд 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 бигӯед, ки модули ниҳонӣ истифода баред
  • -а далел аст. Дар ин ҷо ҳама гуна фармонро ворид кардан мумкин аст
  • гурӯҳ — номи кластери шумо. Агар ба шумо лозим ояд, ки ин корро дар ҳама кластерҳо анҷом диҳед, гурӯҳро ба ҳама иваз кунед

Биёед минбаъд равем - биёед кӯшиш кунем, ки дар мошинҳои виртуалии худ 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 ба лоиҳаҳои дигар, шумо танҳо лозим аст, ки номи хидматро барои аз нав оғоз кардан ва номи кластере, ки дар он фармонҳои мувофиқ иҷро карда мешаванд, тағир диҳед.

Манбаъ: will.com

Илова Эзоҳ