Ansible + auto git ձգում է ամպի մեջ վիրտուալ մեքենաների կլաստեր

Ansible + auto git ձգում է ամպի մեջ վիրտուալ մեքենաների կլաստեր

Լավ օր

Մենք ունենք մի քանի ամպային կլաստերներ՝ յուրաքանչյուրում մեծ թվով վիրտուալ մեքենաներով: Այս ամբողջ բիզնեսը մենք հյուրընկալում ենք Hetzner-ում: Յուրաքանչյուր կլաստերի մեջ մենք ունենք մեկ հիմնական մեքենա, որից վերցվում է լուսանկար և ավտոմատ կերպով բաշխվում է կլաստերի բոլոր վիրտուալ մեքենաներին:

Այս սխեման թույլ չի տալիս մեզ նորմալ օգտագործել gitlab-runners, քանի որ շատ խնդիրներ են առաջանում, երբ հայտնվում են բազմաթիվ նույնական գրանցված վազորդներ, ինչը մեզ հուշում է գտնել լուծում և գրել այս հոդվածը/ձեռնարկը:

Սա, հավանաբար, լավագույն փորձը չէ, բայց այս լուծումը հնարավորինս հարմար և պարզ էր թվում:

Ուսուցման համար տե՛ս cat.

Պահանջվող փաթեթներ հիմնական մեքենայի վրա.

  • Python
  • գիտ
  • ֆայլ ssh ստեղներով

Բոլոր վիրտուալ մեքենաների վրա աղիքների ավտոմատ ձգման իրականացման ընդհանուր սկզբունքն այն է, որ ձեզ անհրաժեշտ է մեքենա, որի վրա կտեղադրվի Ansible-ը: Այս մեքենայից ansible-ը կուղարկի git pull հրամաններ և կվերագործարկի թարմացված ծառայությունը: Այս նպատակների համար մենք ստեղծեցինք առանձին վիրտուալ մեքենա կլաստերներից դուրս և տեղադրեցինք դրա վրա.

  • Python
  • ածելի
  • gitlab-runner

Կազմակերպչական խնդիրներից՝ դուք պետք է գրանցեք gitlab-runner, ստեղծեք ssh-keygen, վերբեռնեք այս մեքենայի հանրային ssh բանալին: .ssh/authorized_keys հիմնական մեքենայի վրա, բաց պորտը 22-ի համար հիմնական մեքենայի վրա:

Հիմա եկեք կազմաձևենք ansible-ը

Քանի որ մեր նպատակն է ավտոմատացնել այն ամենը, ինչ հնարավոր է: Ֆայլում /etc/ansible/ansible.cfg մենք չմեկնաբանենք տողը host_key_checking = Falseորպեսզի ansible-ը նոր մեքենաների հաստատում չխնդրի:

Հաջորդը, դուք պետք է ավտոմատ կերպով գեներացնեք գույքագրման ֆայլ ansible-ի համար, որտեղից այն կվերցնի այն մեքենաների IP-ն, որոնց վրա դուք պետք է կատարեք git pull:

Մենք ստեղծում ենք այս ֆայլը՝ օգտագործելով 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-ին օգտագործել shell մոդուլը
  • -ա փաստարկն է: Այստեղ կարելի է մուտքագրել ցանկացած հրաման
  • խումբ - ձեր կլաստերի անունը: Եթե ​​Ձեզ անհրաժեշտ է դա անել բոլոր կլաստերների վրա, փոխեք խումբը բոլորի

Եկեք գնանք ավելի հեռու. եկեք փորձենք 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

Добавить комментарий