Լավ օր
Մենք ունենք մի քանի ամպային կլաստերներ՝ յուրաքանչյուրում մեծ թվով վիրտուալ մեքենաներով: Այս ամբողջ բիզնեսը մենք հյուրընկալում ենք 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