selamat hari
Kami mempunyai beberapa kluster awan dengan sejumlah besar mesin maya dalam setiap gugusan. Kami menganjurkan semua ini di Hetzner. Dalam setiap kluster kita mempunyai satu mesin induk, syot kilat diambil daripadanya dan diedarkan secara automatik kepada semua mesin maya dalam kluster.
Skim ini tidak membenarkan kami menggunakan gitlab-runners seperti biasa, kerana banyak masalah timbul apabila banyak pelari berdaftar yang sama muncul, yang mendorong kami untuk mencari penyelesaian dan menulis artikel/manual ini.
Ini mungkin bukan amalan terbaik, tetapi penyelesaian ini kelihatan semudah dan semudah mungkin.
Untuk tutorial, sila lihat kucing.
Pakej yang diperlukan pada mesin induk:
- ular sawa
- pergi
- fail dengan kekunci ssh
Prinsip umum untuk melaksanakan tarikan usus automatik pada semua mesin maya ialah anda memerlukan mesin yang Ansible akan dipasang. Dari mesin ini, ansible akan menghantar arahan git pull dan memulakan semula perkhidmatan yang telah dikemas kini. Untuk tujuan ini, kami mencipta mesin maya yang berasingan di luar kelompok dan dipasang padanya:
- ular sawa
- ansible
- gitlab-runner
Daripada isu organisasi - anda perlu mendaftar gitlab-runner, buat ssh-keygen, muat naik kunci ssh awam mesin ini ke .ssh/authorized_keys
pada mesin induk, buka port 22 untuk ansible pada mesin induk.
Sekarang mari kita konfigurasikan ansible
Memandangkan matlamat kami adalah untuk mengautomasikan segala yang mungkin. Dalam fail /etc/ansible/ansible.cfg
kami akan menyahkomen baris host_key_checking = False
supaya ansible tidak meminta pengesahan mesin baru.
Seterusnya, anda perlu menjana fail inventori secara automatik untuk ansible, dari mana ia akan mengambil ip mesin yang anda perlukan untuk melakukan git pull.
Kami menjana fail ini menggunakan API Hetzner, anda boleh mengambil senarai hos daripada pangkalan data AWS, Asure, anda (anda mempunyai API di suatu tempat untuk memaparkan mesin anda yang sedang berjalan, bukan?).
Struktur fail inventori adalah sangat penting untuk Ansible; ia sepatutnya kelihatan seperti ini:
[Π³ΡΡΠΏΠΏΠ°]
ip-Π°Π΄ΡΠ΅Ρ
ip-Π°Π΄ΡΠ΅Ρ
[Π³ΡΡΠΏΠΏΠ°2]
ip-Π°Π΄ΡΠ΅Ρ
ip-Π°Π΄ΡΠ΅Ρ
Untuk menjana fail sedemikian, kami akan membuat skrip mudah (mari namakannya 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
Sudah tiba masanya untuk menyemak bahawa ansible berfungsi dan mesra dengan menerima alamat IP:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Output harus mengandungi nama hos bagi mesin di mana perintah itu dilaksanakan.
Beberapa perkataan tentang sintaks:
- /etc/ansible/./vm_list - jana senarai mesin
- -i - laluan mutlak ke fail inventori
- -m - beritahu ansible untuk menggunakan modul shell
- -a ialah hujah. Sebarang arahan boleh dimasukkan di sini
- kumpulan β nama kluster anda. Jika anda perlu melakukan ini pada semua kelompok, tukar kumpulan kepada semua
Mari pergi lebih jauh - mari cuba lakukan git pull pada mesin maya kami:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Jika dalam output kita melihat sudah dikemas kini atau memunggah dari repositori, maka semuanya berfungsi.
Sekarang ini adalah tujuan semua itu
Mari ajar skrip kami untuk dijalankan secara automatik apabila membuat komitmen kepada cawangan induk dalam gitlab
Mula-mula, mari kita jadikan skrip kita lebih cantik dan letakkannya dalam fail boleh laku (mari kita panggil exec_pull) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Mari pergi ke gitlab kami dan buat fail dalam projek .gitlab-ci.yml
Kami meletakkan perkara berikut di dalam:
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
Semua dah siap. Sekarang -
- buat komitmen
- Saya gembira kerana semuanya berfungsi
Apabila memindahkan .yml ke projek lain, anda hanya perlu menukar nama perkhidmatan untuk dimulakan semula dan nama kluster di mana arahan ansible akan dilaksanakan.
Sumber: www.habr.com