Ansible + auto git pull i ett kluster av virtuella maskiner i molnet

Ansible + auto git pull i ett kluster av virtuella maskiner i molnet

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
  • 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 = Falseså 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

Lägg en kommentar