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 = False
ku 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