Maayong adlaw
Kami adunay daghang mga cloud cluster nga adunay daghang mga virtual machine sa matag usa. Among gi-host kining tibuok negosyo sa Hetzner. Sa matag cluster aduna kitay usa ka master machine, usa ka snapshot ang gikuha gikan niini ug awtomatikong ipanghatag sa tanang virtual machine sulod sa cluster.
Kini nga laraw wala magtugot kanamo sa paggamit sa gitlab-runners sa kasagaran, tungod kay daghang mga problema ang motumaw kung daghang parehas nga narehistro nga mga runner ang makita, nga nag-aghat kanamo nga mangita usa ka solusyon ug isulat kini nga artikulo / manwal.
Tingali dili kini ang labing kaayo nga praktis, apan kini nga solusyon ingon kadali ug yano kutob sa mahimo.
Para sa tutorial, palihog tan-awa ang iring.
Gikinahanglan nga mga pakete sa master machine:
- python
- git
- file nga adunay ssh key
Ang kinatibuk-ang prinsipyo sa pagpatuman sa automatic gut pull sa tanang virtual machine mao nga kinahanglan nimo ang usa ka makina diin ang Ansible ma-install. Gikan niini nga makina, ang ansible magpadala sa git pull commands ug i-restart ang serbisyo nga na-update. Alang niini nga mga katuyoan, naghimo kami usa ka bulag nga virtual machine sa gawas sa mga pungpong ug gi-install kini:
- python
- ansible
- gitlab-runner
Gikan sa mga isyu sa organisasyon - kinahanglan nimo nga magparehistro sa gitlab-runner, paghimo sa ssh-keygen, pag-upload sa publiko nga ssh key niini nga makina sa .ssh/authorized_keys
sa master machine, ablihi ang port 22 para ansible sa master machine.
Karon atong i-configure ang ansible
Tungod kay ang among katuyoan mao ang pag-automate sa tanan nga mahimo. Sa file /etc/ansible/ansible.cfg
atong uncomment ang linya host_key_checking = False
aron ang ansible dili mangayo alang sa pagkumpirma sa mga bag-ong makina.
Sunod, kinahanglan nimo nga awtomatiko nga makamugna usa ka file sa imbentaryo alang sa ansible, gikan diin kuhaon ang ip sa mga makina diin kinahanglan nimo buhaton ang git pull.
Gihimo namo kini nga file gamit ang Hetzner's API, mahimo nimong kuhaon ang lista sa mga host gikan sa imong AWS, Asure, database (naa kay API sa usa ka dapit aron ipakita ang imong running machines, di ba?).
Ang istruktura sa file sa imbentaryo hinungdanon kaayo alang sa Ansible; kini kinahanglan tan-awon sama niini:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Aron makamugna og ingon nga file, maghimo kami usa ka yano nga script (tawagon nato kini 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
Panahon na aron susihon nga ang Ansible nagtrabaho ug mahigalaon sa pagdawat sa mga adres sa IP:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Ang output kinahanglan nga adunay mga hostname sa mga makina diin ang command gipatuman.
Pipila ka mga pulong mahitungod sa syntax:
- /etc/ansible/./vm_list - paghimo ug lista sa mga makina
- -i - hingpit nga agianan sa file sa imbentaryo
- -m - tell ansible nga gamiton ang shell module
- -a mao ang argumento. Ang bisan unsang sugo mahimong masulod dinhi
- grupo — ang ngalan sa imong cluster. Kung kinahanglan nimo nga buhaton kini sa tanan nga mga cluster, usba ang grupo sa tanan
Magpadayon kita - sulayan nato ang paghimo sa git pull sa atong mga virtual machine:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Kung sa output atong makita nga up to date o unloading gikan sa repository, nan ang tanan nagtrabaho.
Karon mao kini ang katuyoan sa tanan
Atong tudloan ang atong script nga awtomatikong modagan sa dihang mo-commit sa master branch sa gitlab
Una, himoon nato nga mas nindot ang atong script ug ibutang kini sa usa ka executable file (tawgon nato kini nga exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Adto ta sa atong gitlab ug maghimo ug file sa project .gitlab-ci.yml
Gibutang namon ang mosunod sa sulod:
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
Andam na ang tanan. Karon-
- paghimo ug pasalig
- Nalipay ko nga ang tanan nagtrabaho
Kung gibalhin ang .yml sa ubang mga proyekto, kinahanglan nimo nga usbon ang ngalan sa serbisyo aron ma-restart ug ang ngalan sa cluster diin ang mga ansible nga mga mando ipatuman.
Source: www.habr.com