Bon dia
Tenim diversos clústers de núvol amb un gran nombre de màquines virtuals en cadascun. Acollim tot aquest negoci a Hetzner. A cada clúster tenim una màquina mestra, se'n pren una instantània i es distribueix automàticament a totes les màquines virtuals del clúster.
Aquest esquema no ens permet utilitzar gitlab-runners amb normalitat, ja que sorgeixen molts problemes quan apareixen molts corredors registrats idèntics, la qual cosa ens va portar a trobar una solució alternativa i escriure aquest article/manual.
Probablement no sigui la millor pràctica, però aquesta solució semblava tan còmoda i senzilla com era possible.
Per al tutorial, vegeu cat.
Paquets necessaris a la màquina mestra:
- pitó
- git
- fitxer amb claus ssh
El principi general d'implementar l'extracció automàtica de l'intestí a totes les màquines virtuals és que necessiteu una màquina on s'instal·li Ansible. Des d'aquesta màquina, ansible enviarà ordres git pull i reiniciarà el servei que s'ha actualitzat. Amb aquests propòsits, vam crear una màquina virtual independent fora dels clústers i vam instal·lar-hi:
- pitó
- ansible
- gitlab-runner
Des de problemes organitzatius: heu de registrar gitlab-runner, fer ssh-keygen, carregar la clau ssh pública d'aquesta màquina a .ssh/authorized_keys
a la màquina mestra, obriu el port 22 per a l'ansible a la màquina mestra.
Ara configurem ansible
Ja que el nostre objectiu és automatitzar tot el que és possible. A l'arxiu /etc/ansible/ansible.cfg
descomentarem la línia host_key_checking = False
de manera que ansible no demana confirmació de noves màquines.
A continuació, heu de generar automàticament un fitxer d'inventari per a ansible, d'on agafarà la ip de les màquines en les quals heu de fer git pull.
Generem aquest fitxer mitjançant l'API d'Hetzner, podeu agafar la llista d'amfitrions de la vostra base de dades AWS, Asure (teniu una API en algun lloc per mostrar les vostres màquines en funcionament, oi?).
L'estructura del fitxer d'inventari és molt important per a Ansible; hauria de ser així:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Per generar aquest fitxer, farem un script senzill (anomenarem-lo 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
És hora de comprovar que Ansible funciona i és amigable amb la recepció d'adreces IP:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
La sortida ha de contenir els noms d'amfitrió de les màquines en què s'ha executat l'ordre.
Unes quantes paraules sobre la sintaxi:
- /etc/ansible/./vm_list - genera una llista de màquines
- -i - camí absolut al fitxer d'inventari
- -m - digueu a ansible que utilitzi el mòdul shell
- -a és l'argument. Aquí es pot introduir qualsevol ordre
- grup: el nom del vostre clúster. Si necessiteu fer-ho a tots els clústers, canvieu el grup a tots
Anem més enllà: intentem fer git pull a les nostres màquines virtuals:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Si a la sortida veiem ja actualitzat o descàrrega del repositori, aleshores tot funciona.
Ara per això estava destinat tot
Ensenyem el nostre script a executar-se automàticament quan ens comprometem amb la branca mestra a gitlab
Primer, fem que el nostre script sigui més bonic i el posem en un fitxer executable (anomenarem-lo exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Anem al nostre gitlab i creem un fitxer al projecte .gitlab-ci.yml
Posem el següent a dins:
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
Tot a punt. Ara -
- fer un compromís
- M'alegro que tot funcioni
Quan transferiu .yml a altres projectes, només heu de canviar el nom del servei per reiniciar-lo i el nom del clúster on s'executaran les ordres ansible.
Font: www.habr.com