Ansible + auto git ดึงคลัสเตอร์ของเครื่องเสมือนในระบบคลาวด์

Ansible + auto git ดึงคลัสเตอร์ของเครื่องเสมือนในระบบคลาวด์

ขอให้เป็นวันที่ดี

เรามีคลัสเตอร์คลาวด์หลายคลัสเตอร์ซึ่งมี Virtual Machine จำนวนมากในแต่ละคลัสเตอร์ เราจัดงานทั้งหมดนี้ที่ Hetzner ในแต่ละคลัสเตอร์ เรามีเครื่องหลักหนึ่งเครื่อง สแน็ปช็อตจะถูกนำมาจากเครื่องนั้นและแจกจ่ายไปยังเครื่องเสมือนทั้งหมดภายในคลัสเตอร์โดยอัตโนมัติ

โครงการนี้ไม่อนุญาตให้เราใช้ gitlab-runners ได้ตามปกติ เนื่องจากมีปัญหามากมายเกิดขึ้นเมื่อมีนักวิ่งที่ลงทะเบียนเหมือนกันหลายรายปรากฏขึ้น ซึ่งทำให้เราต้องค้นหาวิธีแก้ปัญหาและเขียนบทความ/คู่มือนี้

นี่อาจไม่ใช่แนวทางปฏิบัติที่ดีที่สุด แต่โซลูชันนี้ดูเหมือนสะดวกและเรียบง่ายที่สุดเท่าที่จะเป็นไปได้

สำหรับบทช่วยสอน โปรดดูที่ cat

แพ็คเกจที่จำเป็นในเครื่องหลัก:

  • หลาม
  • คอมไพล์
  • ไฟล์ด้วยคีย์ ssh

หลักการทั่วไปของการนำระบบดึงข้อมูลอัตโนมัติไปใช้กับเครื่องเสมือนทั้งหมดคือ คุณต้องมีเครื่องที่จะติดตั้ง Ansible จากเครื่องนี้ ansible จะส่งคำสั่ง git pull และรีสตาร์ทบริการที่อัปเดตแล้ว เพื่อวัตถุประสงค์เหล่านี้ เราได้สร้างเครื่องเสมือนแยกต่างหากภายนอกคลัสเตอร์และติดตั้งไว้บนเครื่อง:

  • หลาม
  • เบิ้ล
  • gitlab-runner

จากปัญหาขององค์กร - คุณต้องลงทะเบียน gitlab-runner, สร้าง ssh-keygen, อัปโหลดคีย์ ssh สาธารณะของเครื่องนี้ไปที่ .ssh/authorized_keys บนเครื่องหลัก ให้เปิดพอร์ต 22 เพื่อให้สามารถอ่านได้บนเครื่องหลัก

ตอนนี้เรามากำหนดค่า ansible กันดีกว่า

เนื่องจากเป้าหมายของเราคือการทำให้ทุกสิ่งที่เป็นไปได้เป็นแบบอัตโนมัติ ในไฟล์ /etc/ansible/ansible.cfg เราจะยกเลิกการใส่เครื่องหมายบรรทัด host_key_checking = Falseเพื่อที่จะไม่ถามถึงการยืนยันเครื่องใหม่

ถัดไป คุณจะต้องสร้างไฟล์สินค้าคงคลังสำหรับ ansible โดยอัตโนมัติ โดยที่มันจะรับ ip ของเครื่องที่คุณต้องทำการ git pull

เราสร้างไฟล์นี้โดยใช้ API ของ Hetzner คุณสามารถรับรายชื่อโฮสต์จากฐานข้อมูล AWS, Asure ของคุณ (คุณมี API ที่ใดที่หนึ่งเพื่อแสดงเครื่องที่ทำงานอยู่ใช่ไหม)

โครงสร้างของไฟล์สินค้าคงคลังมีความสำคัญมากสำหรับ Ansible โดยควรมีลักษณะดังนี้:

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

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

ในการสร้างไฟล์ดังกล่าว เราจะสร้างสคริปต์ง่ายๆ (ลองเรียกมันว่า 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

ถึงเวลาตรวจสอบว่าใช้งานได้และเป็นมิตรกับการรับที่อยู่ IP:

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

เอาต์พุตควรมีชื่อโฮสต์ของเครื่องที่ดำเนินการคำสั่ง
คำสองสามคำเกี่ยวกับไวยากรณ์:

  • /etc/ansible/./vm_list - สร้างรายการเครื่อง
  • -i - เส้นทางที่แน่นอนไปยังไฟล์สินค้าคงคลัง
  • -m - บอกได้ว่าจะใช้โมดูลเชลล์
  • -a คือข้อโต้แย้ง สามารถป้อนคำสั่งใดก็ได้ที่นี่
  • group — ชื่อคลัสเตอร์ของคุณ หากคุณต้องการทำเช่นนี้กับคลัสเตอร์ทั้งหมด ให้เปลี่ยนกลุ่มเป็นทั้งหมด

ก้าวต่อไป - ลองทำ git pull บนเครื่องเสมือนของเรา:

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

หากในผลลัพธ์เราเห็นเป็นข้อมูลล่าสุดหรือยกเลิกการโหลดจากพื้นที่เก็บข้อมูล แสดงว่าทุกอย่างทำงานได้

ตอนนี้นี่คือสิ่งที่มันมีไว้สำหรับทั้งหมด

มาสอนสคริปต์ของเราให้ทำงานโดยอัตโนมัติเมื่อยอมรับสาขาหลักใน gitlab

ก่อนอื่น มาทำให้สคริปต์ของเราสวยงามยิ่งขึ้นและใส่ไว้ในไฟล์ปฏิบัติการ (เรียกมันว่า exec_pull ดีกว่า) -

#!/bin/bash

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

ไปที่ gitlab ของเราและสร้างไฟล์ในโครงการ .gitlab-ci.yml
เราใส่สิ่งต่อไปนี้ไว้ข้างใน:

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 

ทุกอย่างพร้อมแล้ว ตอนนี้ -

  • กระทำการ
  • ฉันดีใจที่ทุกอย่างทำงานได้

เมื่อถ่ายโอน .yml ไปยังโปรเจ็กต์อื่น คุณเพียงแค่ต้องเปลี่ยนชื่อของบริการเพื่อรีสตาร์ทและชื่อของคลัสเตอร์ที่จะดำเนินการคำสั่งที่เข้าใจได้

ที่มา: will.com

เพิ่มความคิดเห็น