Ansible + auto git pull Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠ±Π»Π°ΠΊΠ°

Ansible + auto git pull Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΎΡ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΎΠ±Π»Π°ΠΊΠ°

Π”ΠΎΠ±ΡŠΡ€ Π΄Π΅Π½

ИмамС няколко ΠΎΠ±Π»Π°Ρ‡Π½ΠΈ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° с голям Π±Ρ€ΠΎΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини във всСки. НиС хоствамС цСлия Ρ‚ΠΎΠ·ΠΈ бизнСс Π² Hetzner. Π’ΡŠΠ² всСки ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΈΠΌΠ°ΠΌΠ΅ Π΅Π΄Π½Π° Π³Π»Π°Π²Π½Π° машина, ΠΎΡ‚ която сС ΠΏΡ€Π°Π²ΠΈ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π½Π° снимка ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ сС разпространява Π΄ΠΎ всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°.

Π’Π°Π·ΠΈ схСма Π½Π΅ Π½ΠΈ позволява Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ gitlab-runners Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²ΡŠΠ·Π½ΠΈΠΊΠ²Π°Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС появят ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ рСгистрирани runner-ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½ΠΈ ΠΏΠΎΠ΄Ρ‚ΠΈΠΊΠ½Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΠΌ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»Π½ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π° напишСм Ρ‚Π°Π·ΠΈ статия/Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ.

Π’ΠΎΠ²Π° вСроятно Π½Π΅ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€Π°Ρ‚Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½ΠΎ Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ изглСТдашС възмоТно Π½Π°ΠΉ-ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΠΈ просто.

Π—Π° ΡƒΡ€ΠΎΠΊΠ°, моля, Π²ΠΈΠΆΡ‚Π΅ ΠΊΠ°Ρ‚.

НСобходими ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина:

  • ΠΏΠΈΡ‚ΠΎΠ½
  • Git
  • Ρ„Π°ΠΉΠ» с ssh ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅

ΠžΠ±Ρ‰ΠΈΡΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Π·Π° внСдряванС Π½Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ изтСглянС Π½Π° Ρ‡Π΅Ρ€Π²Π°Ρ‚Π° Π½Π° всички Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини Π΅, Ρ‡Π΅ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ машина, Π½Π° която Ρ‰Π΅ бъдС инсталиран Ansible. ΠžΡ‚ Ρ‚Π°Π·ΠΈ машина ansible Ρ‰Π΅ ΠΈΠ·ΠΏΡ€Π°Ρ‚ΠΈ git pull ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΈ Ρ‰Π΅ рСстартира услугата, която Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π°. Π—Π° Ρ‚Π΅Π·ΠΈ Ρ†Π΅Π»ΠΈ ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ ΠΎΡ‚Π΄Π΅Π»Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина извън ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈΡ‚Π΅ ΠΈ инсталирахмС Π½Π° нСя:

  • ΠΏΠΈΡ‚ΠΎΠ½
  • ansible
  • gitlab-Π±Π΅Π³Π°Ρ‡

ΠžΡ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ - трябва Π΄Π° рСгистриратС gitlab-runner, Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ssh-keygen, Π΄Π° ΠΊΠ°Ρ‡ΠΈΡ‚Π΅ публичния ssh ΠΊΠ»ΡŽΡ‡ Π½Π° Ρ‚Π°Π·ΠΈ машина Π½Π° .ssh/authorized_keys Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина, ΠΎΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ ΠΏΠΎΡ€Ρ‚ 22 Π·Π° ansible Π½Π° Π³Π»Π°Π²Π½Π°Ρ‚Π° машина.

Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌΠ΅ ansible

Въй ΠΊΠ°Ρ‚ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Ρ†Π΅Π» Π΅ Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ възмоТно. Π’ΡŠΠ² Ρ„Π°ΠΉΠ» /etc/ansible/ansible.cfg Ρ‰Π΅ Ρ€Π°Π·ΠΊΠΎΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Ρ€Π΅Π΄Π° host_key_checking = FalseΡ‚Π°ΠΊΠ° Ρ‡Π΅ ansible Π΄Π° Π½Π΅ иска ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π·Π° Π½ΠΎΠ²ΠΈ машини.

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° трябва Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π΅Π½ Ρ„Π°ΠΉΠ» Π·Π° ansible, ΠΎΡ‚ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Ρ‰Π΅ Π²Π·Π΅ΠΌΠ΅ ip Π½Π° ΠΌΠ°ΡˆΠΈΠ½ΠΈΡ‚Π΅, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ git pull.

НиС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠ·ΠΈ Ρ„Π°ΠΉΠ» с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° API Π½Π° Hetzner, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ списъка с хостовС ΠΎΡ‚ Π²Π°ΡˆΠ°Ρ‚Π° AWS, Asure, Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ (ΠΈΠΌΠ°Ρ‚Π΅ API някъдС, Π·Π° Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ машини, Π½Π°Π»ΠΈ?).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° Π½Π° Ρ„Π°ΠΉΠ»Π° с ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π° Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π²Π°ΠΆΠ½Π° Π·Π° Ansible; трябва Π΄Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

[Π³Ρ€ΡƒΠΏΠΏΠ°]
ip-адрСс
ip-адрСс

[Π³Ρ€ΡƒΠΏΠΏΠ°2]
ip-адрСс
ip-адрСс

Π—Π° Π΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚Π°ΠΊΡŠΠ² Ρ„Π°ΠΉΠ», Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ прост скрипт (Π½Π΅ΠΊΠ° Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ 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

Π’Ρ€Π΅ΠΌΠ΅ Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ Ansible Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ Π΅ приятСлски настроСн с ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° IP адрСси:

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

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΡŠΡ‚ трябва Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° хостовСтС Π½Π° ΠΌΠ°ΡˆΠΈΠ½ΠΈΡ‚Π΅, Π½Π° ΠΊΠΎΠΈΡ‚ΠΎ Π΅ изпълнСна ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π°.
Няколко Π΄ΡƒΠΌΠΈ Π·Π° синтаксиса:

  • /etc/ansible/./vm_list - Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° списък с машини
  • -i - Π°Π±ΡΠΎΠ»ΡŽΡ‚Π΅Π½ ΠΏΡŠΡ‚ Π΄ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΈΠ½Π²Π΅Π½Ρ‚Π°Ρ€Π°
  • -m - ΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½Π° ansible Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΌΠΎΠ΄ΡƒΠ»Π° shell
  • -a Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚. Всяка ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС въвСдСна Ρ‚ΡƒΠΊ
  • Π³Ρ€ΡƒΠΏΠ° β€” ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° вашия ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€. Ако трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ Ρ‚ΠΎΠ²Π° Π½Π° всички ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ΠΈ, ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Ρ‚Π΅ Π³Ρ€ΡƒΠΏΠ°Ρ‚Π° Π½Π° всички

НСка ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ - Π½Π΅ΠΊΠ° сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ git pull Π½Π° Π½Π°ΡˆΠΈΡ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ машини:

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

Ако Π² ΠΈΠ·Ρ…ΠΎΠ΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π²Π΅Ρ‡Π΅ Π°ΠΊΡ‚ΡƒΠ°Π»Π΅Π½ ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ ΠΎΡ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅Ρ‚ΠΎ, Ρ‚ΠΎΠ³Π°Π²Π° всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ.

Π‘Π΅Π³Π° всичко Ρ‚ΠΎΠ²Π° бСшС ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ Π·Π° Ρ‚ΠΎΠ²Π°

НСка Π½Π°ΡƒΡ‡ΠΈΠΌ нашия скрипт Π΄Π° сС изпълнява Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС Π°Π½Π³Π°ΠΆΠΈΡ€Π°ΠΌΠ΅ с главния ΠΊΠ»ΠΎΠ½ Π² gitlab

ΠŸΡŠΡ€Π²ΠΎ, Π½Π΅ΠΊΠ° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ нашия скрипт ΠΏΠΎ-красив ΠΈ Π³ΠΎ поставим Π² изпълним Ρ„Π°ΠΉΠ» (Π½Π΅ΠΊΠ° Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌ exec_pull) -

#!/bin/bash

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

НСка Π΄Π° ΠΎΡ‚ΠΈΠ΄Π΅ΠΌ Π² Π½Π°ΡˆΠ°Ρ‚Π° gitlab ΠΈ Π΄Π° създадСм Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° .gitlab-ci.yml
Π’ΡŠΡ‚Ρ€Π΅ поставямС слСдното:

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 

Всичко Π΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ. Π‘Π΅Π³Π° -

  • Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½Ρ‚
  • Π Π°Π΄Π²Π°ΠΌ сС, Ρ‡Π΅ всичко Ρ€Π°Π±ΠΎΡ‚ΠΈ

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΡΡ‚Π΅ .yml към Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, просто трябва Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° услугата, която Π΄Π° рСстартиратС, ΠΈ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, Π½Π° ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ анзибъл ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡ‚Π΅.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€