Ansible + auto git pull ื‘ืืฉื›ื•ืœ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ืขื ืŸ

Ansible + auto git pull ื‘ืืฉื›ื•ืœ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ืขื ืŸ

ื™ื•ื ื˜ื•ื‘

ื™ืฉ ืœื ื• ื›ืžื” ืืฉื›ื•ืœื•ืช ืขื ืŸ ืขื ืžืกืคืจ ืจื‘ ืฉืœ ืžื›ื•ื ื•ืช ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ื›ืœ ืื—ื“. ืื ื—ื ื• ืžืืจื—ื™ื ืืช ื›ืœ ื”ืขืกืง ื”ื–ื” ื‘ื”ืฆื ืจ. ื‘ื›ืœ ืืฉื›ื•ืœ ื™ืฉ ืœื ื• ืžื—ืฉื‘ ืžืืกื˜ืจ ืื—ื“, ื ืœืงื—ืช ืžืžื ื• ืชืžื•ื ืช ืžืฆื‘ ื•ืžื•ืคืฆืช ืื•ื˜ื•ืžื˜ื™ืช ืœื›ืœ ื”ืžื›ื•ื ื•ืช ื”ื•ื•ื™ืจื˜ื•ืืœื™ื•ืช ื‘ืชื•ืš ื”ืืฉื›ื•ืœ.

ืกื›ื™ืžื” ื–ื• ืื™ื ื” ืžืืคืฉืจืช ืœื ื• ืœื”ืฉืชืžืฉ ื‘-gitlab-runners ื‘ืื•ืคืŸ ืจื’ื™ืœ, ืžื›ื™ื•ื•ืŸ ืฉื”ืจื‘ื” ื‘ืขื™ื•ืช ืžืชืขื•ืจืจื•ืช ื›ืืฉืจ ืžื•ืคื™ืขื™ื ืจืฆื™ื ืจืฉื•ืžื™ื ืจื‘ื™ื ื–ื”ื™ื, ืžื” ืฉื’ืจื ืœื ื• ืœืžืฆื•ื ืคืชืจื•ืŸ ืขื•ืงืฃ ื•ืœื›ืชื•ื‘ ืืช ื”ืžืืžืจ/ื”ืžื“ืจื™ืš ื”ื–ื”.

ื–ื” ื›ื ืจืื” ืœื ื”ืฉื™ื˜ื” ื”ื˜ื•ื‘ื” ื‘ื™ื•ืชืจ, ืื‘ืœ ื”ืคืชืจื•ืŸ ื”ื–ื” ื ืจืื” ื ื•ื— ื•ืคืฉื•ื˜ ื›ื›ืœ ื”ืืคืฉืจ.

ืœื”ื“ืจื›ื”, ืจืื” ื—ืชื•ืœ.

ื—ื‘ื™ืœื•ืช ื ื“ืจืฉื•ืช ื‘ืžื›ื•ื ื” ื”ืจืืฉื™ืช:

  • ืคึผึดื™ืชื•ึนืŸ
  • ืกื™ืœื•ืŸ
  • ืงื•ื‘ืฅ ืขื ืžืงืฉื™ ssh

ื”ืขื™ืงืจื•ืŸ ื”ื›ืœืœื™ ืฉืœ ื”ื˜ืžืขืช ืžืฉื™ื›ื” ืื•ื˜ื•ืžื˜ื™ืช ืฉืœ ื”ื‘ื˜ืŸ ื‘ื›ืœ ื”ืžื›ื•ื ื•ืช ื”ื•ื™ืจื˜ื•ืืœื™ื•ืช ื”ื•ื ืฉืืชื” ืฆืจื™ืš ืžื›ื•ื ื” ืฉืขืœื™ื” ืชื•ืชืงืŸ Ansible. ืžื”ืžื—ืฉื‘ ื”ื–ื”, ansible ื™ืฉืœื— ืคืงื•ื“ื•ืช git pull ื•ืชืคืขื™ืœ ืžื—ื“ืฉ ืืช ื”ืฉื™ืจื•ืช ืฉืขื•ื“ื›ืŸ. ืœืžื˜ืจื•ืช ืืœื•, ื™ืฆืจื ื• ืžื›ื•ื ื” ื•ื™ืจื˜ื•ืืœื™ืช ื ืคืจื“ืช ืžื—ื•ืฅ ืœืืฉื›ื•ืœื•ืช ื•ื”ืชืงื ื• ืขืœื™ื”:

  • ืคึผึดื™ืชื•ึนืŸ
  • ansible
  • gitlab-ranner

ืžื‘ืขื™ื•ืช ืืจื’ื•ื ื™ื•ืช - ืขืœื™ืš ืœืจืฉื•ื ืืช gitlab-runner, ืœื™ืฆื•ืจ ssh-keygen, ืœื”ืขืœื•ืช ืืช ืžืคืชื— ื”-ssh ื”ืฆื™ื‘ื•ืจื™ ืฉืœ ื”ืžื—ืฉื‘ ื”ื–ื” .ssh/authorized_keys ื‘ืžื›ื•ื ื” ื”ืจืืฉื™ืช, ืคืชื— ืืช ื™ืฆื™ืื” 22 ืœืืคืฉืจื•ืช ื‘ืžื›ื•ื ื” ื”ืจืืฉื™ืช.

ืขื›ืฉื™ื• ื‘ื•ื ื ื’ื“ื™ืจ ืืช ansible

ืžืื– ื”ืžื˜ืจื” ืฉืœื ื• ื”ื™ื ืœื”ืคื•ืš ืืช ื›ืœ ืžื” ืฉืืคืฉืจ. ื‘ืงื•ื‘ืฅ /etc/ansible/ansible.cfg ื ื‘ื˜ืœ ืืช ื”ื”ืขืจื•ืช ืœืฉื•ืจื” host_key_checking = Falseื›ืš ืฉืื ืกื™ื‘ืœ ืœื ื™ื‘ืงืฉ ืื™ืฉื•ืจ ืฉืœ ืžื›ื•ื ื•ืช ื—ื“ืฉื•ืช.

ืœืื—ืจ ืžื›ืŸ, ืืชื” ืฆืจื™ืš ืœื™ืฆื•ืจ ืื•ื˜ื•ืžื˜ื™ืช ืงื•ื‘ืฅ ืžืœืื™ ืขื‘ื•ืจ 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 - ืชื’ื™ื“ ืœืื ืกื™ื‘ืœ ืœื”ืฉืชืžืฉ ื‘ืžื•ื“ื•ืœ ื”ืžืขื˜ืคืช
  • -ื ื”ื•ื ื”ื˜ื™ืขื•ืŸ. ื ื™ืชืŸ ืœื”ื–ื™ืŸ ื›ืืŸ ื›ืœ ืคืงื•ื“ื”
  • ืงื‘ื•ืฆื” - ืฉื ื”ืืฉื›ื•ืœ ืฉืœืš. ืื ืืชื” ืฆืจื™ืš ืœืขืฉื•ืช ื–ืืช ื‘ื›ืœ ื”ืืฉื›ื•ืœื•ืช, ืฉื ื” ืงื‘ื•ืฆื” ืœื›ื•ืœื

ื‘ื•ืื• ื ืœืš ืจื—ื•ืง ื™ื•ืชืจ - ื‘ื•ืื• ื ื ืกื” ืœืขืฉื•ืช 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”