God dag
Vi har flera molnkluster med ett stort antal virtuella maskiner i varje. Vi är värd för hela denna verksamhet på Hetzner. I varje kluster har vi en mastermaskin, en ögonblicksbild tas från den och distribueras automatiskt till alla virtuella maskiner inom klustret.
Detta schema tillåter oss inte att använda gitlab-runners normalt, eftersom många problem uppstår när många identiska registrerade löpare dyker upp, vilket fick oss att hitta en lösning och skriva denna artikel/manual.
Detta är förmodligen inte bästa praxis, men den här lösningen verkade så bekväm och enkel som möjligt.
För handledningen, se cat.
Nödvändiga paket på huvudmaskinen:
- pytonorm
- gå
- fil med ssh-nycklar
Den allmänna principen för att implementera automatisk gut pull på alla virtuella maskiner är att du behöver en maskin som Ansible kommer att installeras på. Från den här maskinen kommer ansible att skicka git pull-kommandon och starta om tjänsten som har uppdaterats. För dessa ändamål skapade vi en separat virtuell maskin utanför klustren och installerade på den:
- pytonorm
- ansible
- gitlab-runner
Från organisatoriska frågor - du måste registrera gitlab-runner, skapa ssh-keygen, ladda upp den offentliga ssh-nyckeln för denna maskin till .ssh/authorized_keys
på mastermaskinen, öppna port 22 för ansible på mastermaskinen.
Låt oss nu konfigurera ansible
Eftersom vårt mål är att automatisera allt som är möjligt. I fil /etc/ansible/ansible.cfg
vi kommer att avkommentera raden host_key_checking = False
så att ansible inte ber om bekräftelse av nya maskiner.
Därefter måste du automatiskt generera en inventeringsfil för ansible, varifrån den kommer att ta ip:en för de maskiner som du behöver göra git pull på.
Vi genererar den här filen med Hetzners API, du kan ta listan över värdar från din AWS, Asure, databas (du har ett API någonstans att visa dina körande maskiner, eller hur?).
Strukturen för inventeringsfilen är mycket viktig för Ansible; den ska se ut så här:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
För att skapa en sådan fil kommer vi att göra ett enkelt skript (låt oss kalla det 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
Det är dags att kontrollera att Ansible fungerar och är vänlig med att ta emot IP-adresser:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Utdata bör innehålla värdnamnen för de maskiner på vilka kommandot kördes.
Några ord om syntax:
- /etc/ansible/./vm_list - generera en lista över maskiner
- -i - absolut sökväg till inventeringsfilen
- -m - berätta för ansible att använda skalmodulen
- -a är argumentet. Alla kommandon kan anges här
- grupp — namnet på ditt kluster. Om du behöver göra detta på alla kluster, byt grupp till alla
Låt oss gå längre - låt oss försöka göra git pull på våra virtuella maskiner:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Om vi redan i utgången ser uppdaterade eller avlastning från förvaret, så fungerar allt.
Nu var det här allt var menat för
Låt oss lära vårt skript att köras automatiskt när vi övergår till mastergrenen i gitlab
Låt oss först göra vårt skript vackrare och lägga det i en körbar fil (låt oss kalla det exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Låt oss gå till vårt gitlab och skapa en fil i projektet .gitlab-ci.yml
Vi lägger in följande inuti:
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
Allt är klart. Nu -
- göra ett åtagande
- Jag är glad att allt fungerar
När du överför .yml till andra projekt behöver du bara ändra namnet på tjänsten för att starta om och namnet på klustret där de eventuella kommandona kommer att köras.
Källa: will.com