Ansible + otomatis git narik dina gugusan mesin virtual dina awan

Ansible + otomatis git narik dina gugusan mesin virtual dina awan

Wilujeng siang

Simkuring gaduh sababaraha klaster awan kalawan angka nu gede ngarupakeun mesin virtual dina unggal. Urang host sakabeh bisnis ieu di Hetzner. Dina unggal klaster kami boga hiji mesin master, snapshot dicokot ti dinya tur otomatis disebarkeun ka sadaya mesin virtual dina klaster.

skéma ieu teu ngidinan urang ngagunakeun gitlab-runners normal, saprak loba masalah timbul nalika loba runners didaptarkeun idéntik muncul, nu ngajurung urang pikeun manggihan workaround jeung nulis artikel ieu / manual.

Ieu sigana sanés prakték anu pangsaéna, tapi solusi ieu sigana saderhana sareng saderhana.

Pikeun tutorial, mangga tingali ucing.

Bungkusan anu diperyogikeun dina mesin master:

  • python
  • séwang
  • file sareng konci ssh

Prinsip umum pikeun ngalaksanakeun tarikan peujit otomatis dina sadaya mesin virtual nyaéta anjeun peryogi mesin dimana Ansible bakal dipasang. Tina mesin ieu, ansible bakal ngirim paréntah git pull sareng ngabalikan deui jasa anu parantos diropéa. Pikeun tujuan ieu, kami nyiptakeun mesin virtual anu misah di luar klaster sareng dipasang di dinya:

  • python
  • ansible
  • gitlab-runner

Tina masalah organisasi - anjeun kedah ngadaptar gitlab-runner, ngadamel ssh-keygen, unggah konci ssh umum tina mesin ieu ka .ssh/authorized_keys dina mesin master, buka port 22 pikeun ansible dina mesin master.

Ayeuna hayu urang ngonpigurasikeun ansible

Kusabab tujuan urang nyaéta pikeun ngajadikeun otomatis sadaya anu mungkin. Dina file /etc/ansible/ansible.cfg urang bakal uncomment garis host_key_checking = Falseku kituna ansible teu menta konfirmasi mesin anyar.

Salajengna, anjeun kedah otomatis ngahasilkeun file inventory pikeun ansible, ti mana éta bakal nyandak ip tina mesin dimana anjeun kedah ngalakukeun git pull.

Kami ngahasilkeun file ieu nganggo API Hetzner, anjeun tiasa nyandak daptar host tina AWS anjeun, Asure, database (anjeun gaduh API dimana waé pikeun nampilkeun mesin anu ngajalankeun anjeun, leres?).

Struktur file inventaris penting pisan pikeun Ansible; éta kedah siga kieu:

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

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

Pikeun ngahasilkeun file sapertos kitu, urang bakal ngadamel skrip saderhana (nyaéta 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

Waktosna pikeun pariksa yén Ansible tiasa dianggo sareng ramah sareng nampi alamat IP:

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

Kaluaran kedah ngandung nami host tina mesin dimana paréntahna dieksekusi.
Sababaraha kecap ngeunaan sintaksis:

  • /etc/ansible/./vm_list - ngahasilkeun daptar mesin
  • -i - jalur mutlak ka file inventory
  • -m - ngabejaan ansible ngagunakeun modul cangkang
  • -a nyaéta argumen. Sakur paréntah tiasa diasupkeun di dieu
  • grup - nami klaster Anjeun. Upami anjeun kedah ngalakukeun ieu dina sadaya klaster, robih grup ka sadayana

Hayu urang langkung jauh - hayu urang cobian git pull dina mesin virtual urang:

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

Lamun dina kaluaran urang tingali geus up to date atanapi unloading ti gudang, teras sagalana jalan.

Ayeuna ieu téh naon ieu sadayana dimaksudkan pikeun

Hayu urang ngajarkeun naskah urang ngajalankeun otomatis nalika committing kana cabang master di gitlab

Mimiti, hayu urang ngadamel skrip urang langkung saé sareng nempatkeun kana file anu tiasa dieksekusi (hayu urang sebut exec_pull) -

#!/bin/bash

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

Hayu urang angkat ka gitlab urang sareng jieun file dina proyék éta .gitlab-ci.yml
Urang nempatkeun di handap ieu di jero:

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 

Kabéh geus siap. Ayeuna-

  • nyieun komitmen
  • Abdi bungah yén sagalana jalan

Nalika nransferkeun .yml ka proyék-proyék anu sanés, anjeun ngan ukur kedah ngarobih nami jasa pikeun ngamimitian deui sareng nami klaster dimana paréntah ansible bakal dieksekusi.

sumber: www.habr.com

Tambahkeun komentar