ขอให้เป็นวันที่ดี
เรามีคลัสเตอร์คลาวด์หลายคลัสเตอร์ซึ่งมี 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