Ansible + auto git vytáhne shluk virtuálních strojů v cloudu

Ansible + auto git vytáhne shluk virtuálních strojů v cloudu

Dobrý den

Máme několik cloudových clusterů s velkým počtem virtuálních strojů v každém. Celý tento podnik hostíme u Hetznera. V každém clusteru máme jeden hlavní stroj, z něj je pořízen snímek a automaticky distribuován na všechny virtuální stroje v rámci clusteru.

Toto schéma nám neumožňuje normálně používat gitlab-runnery, protože když se objeví mnoho identických registrovaných běžců, vyvstává spousta problémů, což nás přimělo najít řešení a napsat tento článek/manuál.

Pravděpodobně to není osvědčený postup, ale toto řešení se zdálo být maximálně pohodlné a jednoduché.

Pro tutoriál, prosím, viz cat.

Požadované balíčky na hlavním počítači:

  • krajta
  • git
  • soubor s klíči ssh

Obecným principem implementace automatického vytažení střev na všech virtuálních strojích je, že potřebujete stroj, na kterém bude nainstalován Ansible. Z tohoto počítače bude ansible odesílat příkazy git pull a restartovat službu, která byla aktualizována. Pro tyto účely jsme vytvořili samostatný virtuální stroj mimo clustery a nainstalovali jsme na něj:

  • krajta
  • ansible
  • gitlab-runner

Z organizačních záležitostí - musíte zaregistrovat gitlab-runner, vytvořit ssh-keygen, nahrát veřejný ssh klíč tohoto stroje do .ssh/authorized_keys na hlavním stroji otevřete port 22 pro povolení na hlavním stroji.

Nyní nakonfigurujeme ansible

Protože naším cílem je automatizovat vše, co je možné. V souboru /etc/ansible/ansible.cfg řádek odkomentujeme host_key_checking = Falseaby ansible nepožadoval potvrzení nových strojů.

Dále musíte automaticky vygenerovat soubor inventáře pro ansible, odkud si vezme ip strojů, na kterých potřebujete provést git pull.

Tento soubor generujeme pomocí Hetznerova API, seznam hostitelů si můžete vzít z vaší AWS, Asure, databáze (máte někde API pro zobrazení vašich běžících strojů, že?).

Struktura souboru inventáře je pro Ansible velmi důležitá; měla by vypadat takto:

[группа]
ip-адрес
ip-адрес

[группа2]
ip-адрес
ip-адрес

Abychom takový soubor vygenerovali, vytvoříme jednoduchý skript (nazvěme ho 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

Je čas zkontrolovat, zda Ansible funguje a je přátelský k přijímání IP adres:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group

Výstup by měl obsahovat názvy počítačů, na kterých byl příkaz proveden.
Pár slov o syntaxi:

  • /etc/ansible/./vm_list - vygeneruje seznam počítačů
  • -i - absolutní cesta k souboru inventáře
  • -m - řekne, aby bylo možné použít modul shellu
  • -a je argument. Zde lze zadat libovolný příkaz
  • group — název vašeho clusteru. Pokud to potřebujete provést na všech clusterech, změňte skupinu na všechny

Pojďme dále – zkusme provést git pull na našich virtuálních strojích:

/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group 

Pokud ve výstupu vidíme již aktuální nebo vykládání z úložiště, pak vše funguje.

Teď to bylo to, k čemu to všechno bylo určeno

Naučme náš skript spouštět se automaticky při odevzdání do hlavní větve v gitlabu

Nejprve udělejme náš skript krásnějším a vložme jej do spustitelného souboru (říkejme mu exec_pull) -

#!/bin/bash

/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"

Pojďme do našeho gitlabu a vytvořte soubor v projektu .gitlab-ci.yml
Dovnitř vložíme následující:

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 

Vše je připraveno. Nyní -

  • učinit závazek
  • Jsem rád, že vše funguje

Při přenosu .yml do jiných projektů stačí změnit název služby pro restart a název clusteru, na kterém se budou provádět ansible příkazy.

Zdroj: www.habr.com

Přidat komentář