İyi günler
Her birinde çok sayıda sanal makine bulunan birkaç bulut kümemiz var. Tüm bu işi Hetzner'de gerçekleştiriyoruz. Her kümede bir ana makinemiz var, ondan anlık görüntü alınıyor ve küme içindeki tüm sanal makinelere otomatik olarak dağıtılıyor.
Bu şema, gitlab-runner'ları normal şekilde kullanmamıza izin vermiyor, çünkü birçok aynı kayıtlı koşucu göründüğünde birçok sorun ortaya çıkıyor ve bu da bizi bir geçici çözüm bulmaya ve bu makaleyi/kılavuzu yazmaya sevk etti.
Bu muhtemelen en iyi uygulama değildir, ancak bu çözüm mümkün olduğunca kullanışlı ve basit görünüyordu.
Öğretici için lütfen cat'e bakın.
Ana makinede gerekli paketler:
- piton
- git
- ssh anahtarlarını içeren dosya
Tüm sanal makinelerde otomatik bağırsak çekme uygulamasının genel ilkesi, Ansible'ın kurulacağı bir makineye ihtiyaç duymanızdır. Ansible bu makineden git pull komutlarını gönderecek ve güncellenen hizmeti yeniden başlatacaktır. Bu amaçla Clusterların dışında ayrı bir sanal makine oluşturup üzerine kurulumunu yaptık:
- piton
- yanıtlayıcı '
- gitlab koşucusu
Organizasyonel sorunlardan - gitlab-runner'ı kaydetmeniz, ssh-keygen yapmanız, bu makinenin genel ssh anahtarını yüklemeniz gerekir. .ssh/authorized_keys
ana makinede, ana makinedeki yanıtlayıcı için 22 numaralı bağlantı noktasını açın.
Şimdi ansible'ı yapılandıralım
Amacımız mümkün olan her şeyi otomatikleştirmek olduğundan. Dosyada /etc/ansible/ansible.cfg
satırın yorumunu kaldıracağız host_key_checking = False
böylece ansible yeni makinelerin onayını istemez.
Daha sonra, ansible için otomatik olarak git pull işlemi yapmanız gereken makinelerin IP'sini alacağı bir envanter dosyası oluşturmanız gerekir.
Bu dosyayı Hetzner'in API'sini kullanarak oluşturuyoruz, ana bilgisayarların listesini AWS, Asure veritabanınızdan alabilirsiniz (çalışan makinelerinizi görüntülemek için bir yerde bir API'niz var, değil mi?).
Envanter dosyasının yapısı Ansible için çok önemlidir; şöyle görünmelidir:
[группа]
ip-адрес
ip-адрес
[группа2]
ip-адрес
ip-адрес
Böyle bir dosya oluşturmak için basit bir komut dosyası oluşturacağız (buna 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'ın çalıştığını ve IP adresi alma konusunda uyumlu olup olmadığını kontrol etmenin zamanı geldi:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'hostname' group
Çıktı, komutun yürütüldüğü makinelerin ana bilgisayar adlarını içermelidir.
Sözdizimi hakkında birkaç kelime:
- /etc/ansible/./vm_list - makinelerin bir listesini oluşturur
- -i - envanter dosyasının mutlak yolu
- -m - ansible'a kabuk modülünü kullanmasını söyle
- -a argümandır. Buraya herhangi bir komut girilebilir
- grup — kümenizin adı. Bunu tüm kümelerde yapmanız gerekiyorsa grubu tümü olarak değiştirin
Daha da ileri gidelim - sanal makinelerimizde git pull yapmayı deneyelim:
/etc/ansible/./vm_list && ansible -i /etc/ansible/cloud_ip -m shell -a 'cd /path/to/project && git pull' group
Çıktıda zaten güncel olduğunu veya depodan boşaltıldığını görürsek, her şey çalışıyor demektir.
Şimdi her şey bunun içindi
Gitlab'da master dalına taahhütte bulunurken betiğimizin otomatik olarak çalışmasını öğretelim
Öncelikle betiğimizi daha güzel hale getirelim ve çalıştırılabilir bir dosyaya koyalım (buna exec_pull adını verelim) -
#!/bin/bash
/etc/ansible/./get_vms && ansible -i /etc/ansible/cloud_ip -m shell -a "$@"
Gitlab'ımıza gidelim ve projede bir dosya oluşturalım .gitlab-ci.yml
İçine şunları koyuyoruz:
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
Her şey hazır. Şimdi -
- taahhütte bulunmak
- Her şeyin yolunda gitmesine sevindim
.yml dosyasını diğer projelere aktarırken, yeniden başlatılacak hizmetin adını ve ansible komutlarının yürütüleceği kümenin adını değiştirmeniz yeterlidir.
Kaynak: habr.com