Ansible + Π°Π²Ρ‚ΠΎ git pull Π² кластСрС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΎΠ±Π»Π°ΠΊΠ΅

Ansible + Π°Π²Ρ‚ΠΎ git pull Π² кластСрС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΎΠ±Π»Π°ΠΊΠ΅

Π”ΠΎΠ±Ρ€ΠΎΠ³ΠΎ дня

Π£ нас имССтся нСсколько ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹Ρ… кластСров с большим количСством Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. ВсС это Π΄Π΅Π»ΠΎ Ρƒ нас хостится Π² Hetzner’e. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ кластСрС Ρƒ нас имССтся ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ мастСр-машинС, с Π½Π΅Π΅ дСлаСтся ΡΠ½ΡΠΏΡˆΠΎΡ‚ ΠΈ автоматичСски разносится ΠΏΠΎ всСм Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠ°ΠΌ Π²Π½ΡƒΡ‚Ρ€ΠΈ кластСра.

Π­Ρ‚Π° схСма Π½Π΅ позволяСт Π½Π°ΠΌ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gitlab-runner’Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ появлСнии мноТСства ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Ρ… зарСгистрированных Ρ€Π°Π½Π½Π΅Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΈ ΠΏΠΎΠ±ΡƒΠ΄ΠΈΠ»ΠΎ ΠΊ Π½Π°Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΎΠ±Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ ΠΈ ΠΊ написанию этой ΡΡ‚Π°Ρ‚ΡŒΠΈ/ΠΌΠ°Π½ΡƒΠ°Π»Π°.

ВСроятно, это Π½Π΅ best practice, Π½ΠΎ это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ показалось максимально ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈ простым.

Π—Π° Ρ‚ΡƒΡ‚ΠΎΡ€ΠΈΠ°Π»ΠΎΠΌ ΠΏΡ€ΠΎΡˆΡƒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚.

НСобходимыС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Π½Π° мастСр-машинС:

  • python
  • git
  • Ρ„Π°ΠΉΠ» с ssh ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ

ΠžΠ±Ρ‰ΠΈΠΉ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ автоматичСского gut pull’a Π½Π° всСх Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΠ°Ρ… Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° машина, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ установлСн Ansible. Π‘ этой ΠΌΠ°ΡˆΠΈΠ½Ρ‹ ansible Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ git pull ΠΈ рСстарт сСрвиса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ заапдСйтился. ΠœΡ‹ создали для этих Ρ†Π΅Π»Π΅ΠΉ ΠΎΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ Π²Π½Π΅ кластСров, поставили Π½Π° Π½Π΅Π΅:

  • python
  • ansible
  • gitlab-runner

Из ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… вопросов β€” Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ 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’a, Π²Ρ‹ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π±Ρ€Π°Ρ‚ΡŒ список хостов ΠΈΠ· вашСй 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 β€” Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ансиблу ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ shell
  • -a β€” Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚. Бюда ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ
  • group β€” Π½Π°Π·Π²Π°Π½ΠΈΠ΅ вашСго кластСра. Если Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½Π° всСх кластСрах, мСняСм group Π½Π° all

ИдСм дальшС β€” ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ git pull Π½Π° Π½Π°ΡˆΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ…:

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

Если Π² Π°ΡƒΡ‚ΠΏΡƒΡ‚Π΅ Π²ΠΈΠ΄ΠΈΠΌ already up to date ΠΈΠ»ΠΈ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈΠ· рСпозитория, Π·Π½Π°Ρ‡ΠΈΡ‚ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ‚ΠΎ, Ρ€Π°Π΄ΠΈ Ρ‡Π΅Π³ΠΎ это всС Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΎΡΡŒ

Научим наш скрипт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ автоматичСски ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΌΠΈΡ‚Π΅ Π² мастСр-Π²Π΅Ρ‚ΠΊΠ΅ Π² gitlab’e

Π‘Π½Π°Ρ‡Π°Π»Π° сдСлаСм наш скрипт красивСС ΠΈ засунСм Π΅Π³ΠΎ Π² исполняСмый Ρ„Π°ΠΉΠ» (Π½Π°Π·ΠΎΠ²Π΅ΠΌ Π΅Π³ΠΎ 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 Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ достаточно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ имя сСрвиса для рСстарта ΠΈ имя кластСра, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ansible.

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