Ansible + auto git buluttaki bir sanal makine kümesini çekiyor

Ansible + auto git buluttaki bir sanal makine kümesini çekiyor

İ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 = Falsebö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

Yorum ekle