Ansible + auto git kéo vào một cụm máy ảo trên đám mây

Ansible + auto git kéo vào một cụm máy ảo trên đám mây

Tốt ngày

Chúng tôi có một số cụm đám mây với số lượng lớn máy ảo trong mỗi cụm. Chúng tôi tổ chức toàn bộ hoạt động kinh doanh này tại Hetzner. Trong mỗi cụm, chúng tôi có một máy chủ, ảnh chụp nhanh được lấy từ máy đó và tự động phân phối đến tất cả các máy ảo trong cụm.

Lược đồ này không cho phép chúng tôi sử dụng gitlab-runners một cách bình thường, vì có rất nhiều vấn đề phát sinh khi có nhiều Á hậu đã đăng ký giống hệt nhau xuất hiện, điều này khiến chúng tôi phải tìm cách giải quyết và viết bài viết/hướng dẫn sử dụng này.

Đây có lẽ không phải là cách thực hành tốt nhất nhưng giải pháp này có vẻ thuận tiện và đơn giản nhất có thể.

Để biết hướng dẫn, vui lòng xem cat.

Các gói bắt buộc trên máy chủ:

  • mãng xà
  • git
  • tập tin có khóa ssh

Nguyên tắc chung của việc triển khai tính năng kéo tự động trên tất cả các máy ảo là bạn cần một máy sẽ được cài đặt Ansible. Từ máy này, ansible sẽ gửi lệnh git pull và khởi động lại dịch vụ đã được cập nhật. Với những mục đích này, chúng tôi đã tạo một máy ảo riêng biệt bên ngoài các cụm và cài đặt trên đó:

  • mãng xà
  • ansible
  • Á hậu gitlab

Từ các vấn đề về tổ chức - bạn cần đăng ký gitlab-runner, tạo ssh-keygen, tải khóa ssh công khai của máy này lên .ssh/authorized_keys trên máy chủ, mở cổng 22 cho ansible trên máy chủ.

Bây giờ hãy cấu hình ansible

Vì mục tiêu của chúng tôi là tự động hóa mọi thứ có thể. Trong tập tin /etc/ansible/ansible.cfg chúng tôi sẽ bỏ ghi chú dòng host_key_checking = Falseđể ansible không yêu cầu xác nhận máy mới.

Tiếp theo, bạn cần tự động tạo một tệp kiểm kê cho ansible, từ đó nó sẽ lấy ip của các máy mà bạn cần thực hiện git pull.

Chúng tôi tạo tệp này bằng API của Hetzner, bạn có thể lấy danh sách máy chủ từ AWS, Asure, cơ sở dữ liệu của mình (bạn có API ở đâu đó để hiển thị các máy đang chạy của mình, phải không?).

Cấu trúc của tệp kiểm kê rất quan trọng đối với Ansible; nó sẽ trông như thế này:

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

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

Để tạo một tệp như vậy, chúng ta sẽ tạo một tập lệnh đơn giản (hãy gọi nó là 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

Đã đến lúc kiểm tra xem Ansible có hoạt động và thân thiện với việc nhận địa chỉ IP hay không:

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

Đầu ra phải chứa tên máy chủ của các máy mà lệnh được thực thi trên đó.
Một vài lời về cú pháp:

  • /etc/ansible/./vm_list - tạo danh sách các máy
  • -i - đường dẫn tuyệt đối tới file kiểm kê
  • -m - yêu cầu ansible sử dụng mô-đun shell
  • -a là đối số. Bất kỳ lệnh nào cũng có thể được nhập vào đây
  • nhóm - tên cụm của bạn. Nếu bạn cần thực hiện việc này trên tất cả các cụm, hãy thay đổi nhóm thành tất cả

Hãy đi xa hơn - hãy thử thực hiện git pull trên các máy ảo của chúng ta:

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

Nếu ở đầu ra, chúng ta thấy đã được cập nhật hoặc đang dỡ khỏi kho lưu trữ thì mọi thứ đều hoạt động.

Bây giờ đây chính là ý nghĩa của nó

Hãy hướng dẫn tập lệnh của chúng ta chạy tự động khi chuyển sang nhánh chính trong gitlab

Đầu tiên, hãy làm cho tập lệnh của chúng ta đẹp hơn và đặt nó vào một tệp thực thi (hãy gọi nó là exec_pull) -

#!/bin/bash

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

Hãy truy cập gitlab của chúng tôi và tạo một tệp trong dự án .gitlab-ci.yml
Chúng tôi đặt những thứ sau vào bên trong:

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 

Tất cả đã sẵn sàng. Hiện nay -

  • thực hiện một cam kết
  • Tôi rất vui vì mọi thứ đều hoạt động

Khi chuyển .yml sang các dự án khác, bạn chỉ cần thay đổi tên của dịch vụ cần khởi động lại và tên của cụm nơi các lệnh ansible sẽ được thực thi.

Nguồn: www.habr.com

Thêm một lời nhận xét