Ансибле + ауто гит повлачи кластер виртуелних машина у облаку

Ансибле + ауто гит повлачи кластер виртуелних машина у облаку

Добар дан

Имамо неколико кластера у облаку са великим бројем виртуелних машина у сваком. Угостимо целу ову ствар у Хетзнеру. У сваком кластеру имамо једну главну машину, са ње се узима снимак и аутоматски се дистрибуира на све виртуелне машине унутар кластера.

Ова шема нам не дозвољава да нормално користимо гитлаб-руннере, јер се јавља много проблема када се појави много идентичних регистрованих покретача, што нас је навело да пронађемо решење и напишемо овај чланак/приручник.

Ово вероватно није најбоља пракса, али ово решење је изгледало што је могуће згодније и једноставније.

За туторијал, погледајте кат.

Потребни пакети на главној машини:

  • питон
  • git
  • датотека са ссх кључевима

Општи принцип имплементације аутоматског повлачења црева на свим виртуелним машинама је да вам је потребна машина на којој ће бити инсталиран Ансибле. Са ове машине, ансибле ће послати гит пулл команде и поново покренути сервис који је ажуриран. За ове сврхе, направили смо засебну виртуелну машину изван кластера и инсталирали на њу:

  • питон
  • ансибле
  • гитлаб-руннер

Од организационих питања - потребно је да региструјете гитлаб-руннер, направите ссх-кеиген, поставите јавни ссх кључ ове машине на .ssh/authorized_keys на главној машини, отворите порт 22 за ансибле на главној машини.

Сада да конфигуришемо ансибле

Пошто нам је циљ да аутоматизујемо све што је могуће. У фајлу /etc/ansible/ansible.cfg декоментарујемо ред host_key_checking = Falseтако да ансибле не тражи потврду нових машина.

Затим морате аутоматски да генеришете датотеку инвентара за ансибле, одакле ће узети ип машина на којима треба да урадите гит пулл.

Ми генеришемо ову датотеку користећи Хетзнер-ов АПИ, можете узети листу хостова из ваше АВС, Асуре, базе података (имате АПИ негде да прикажете ваше покренуте машине, зар не?).

Структура датотеке инвентара је веома важна за Ансибле; требало би да изгледа овако:

[группа]
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

Време је да проверите да ли Ансибле ради и да ли је пријатељски са пријемом ИП адреса:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group

Излаз треба да садржи имена хостова машина на којима је команда извршена.
Неколико речи о синтакси:

  • /етц/ансибле/./вм_лист - генерише листу машина
  • -и - апсолутна путања до датотеке инвентара
  • -м - реци ансибле-у да користи модул љуске
  • -а је аргумент. Овде се може унети било која команда
  • група — назив вашег кластера. Ако то треба да урадите на свим кластерима, промените групу у све

Идемо даље - хајде да покушамо да урадимо гит пулл на нашим виртуелним машинама:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

Ако у излазу видимо већ ажурирано или истовар из спремишта, онда све ради.

Сада је ово све за шта је то било намењено

Хајде да научимо нашу скрипту да се покреће аутоматски када се урезује на главну грану у гитлабу

Прво, хајде да нашу скрипту учинимо лепшом и ставимо је у извршну датотеку (назовимо је екец_пулл) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

Идемо у наш гитлаб и креирамо датотеку у пројекту .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 

Све је спремно. Сада -

  • извршити обавезу
  • Драго ми је да све функционише

Када преносите .имл на друге пројекте, потребно је само да промените име сервиса за поновно покретање и име кластера на коме ће се извршавати ансибле команде.

Извор: ввв.хабр.цом

Додај коментар