Ansible + auto git pull бұлттағы виртуалды машиналар кластерінде

Ansible + auto git pull бұлттағы виртуалды машиналар кластерінде

Қайырлы күн

Бізде әрқайсысында көптеген виртуалды машиналары бар бірнеше бұлттық кластерлер бар. Біз бұл бизнестің барлығын Hetzner-де өткіземіз. Әрбір кластерде бізде бір негізгі машина бар, оның суреті алынады және кластердегі барлық виртуалды машиналарға автоматты түрде таратылады.

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

Бұл ең жақсы тәжірибе емес шығар, бірақ бұл шешім мүмкіндігінше ыңғайлы және қарапайым болып көрінді.

Оқулық үшін мысықты қараңыз.

Негізгі құрылғыдағы қажетті пакеттер:

  • питон
  • Git
  • ssh пернелері бар файл

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

  • питон
  • мүмкін емес
  • gitlab жүгірушісі

Ұйымдастыру мәселелерінен - ​​gitlab-runner тіркеу, ssh-keygen жасау, осы машинаның жалпы ssh кілтін жүктеп салу қажет. .ssh/authorized_keys негізгі құрылғыда, негізгі құрылғыда ansible үшін 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 

Егер нәтижеде біз қазірдің өзінде жаңартылғанын немесе репозиторийден түсіруді көретін болсақ, онда бәрі жұмыс істейді.

Енді мұның бәрі осы мақсатқа арналды

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 файлын басқа жобаларға тасымалдаған кезде, қайта іске қосу үшін қызмет атауын және ансибилді пәрмендер орындалатын кластердің атын өзгерту қажет.

Ақпарат көзі: www.habr.com

пікір қалдыру