ใช้ git สำหรับไฟล์การกำหนดค่าเซิร์ฟเวอร์หลายไฟล์


14

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

คำถามนี้คล้ายกับการใช้การควบคุมการแก้ไขสำหรับไฟล์การกำหนดค่าเซิร์ฟเวอร์? แต่เรามีข้อกำหนดพิเศษบางอย่างที่ไม่ทำงานกับคำแนะนำสำหรับคำถามนั้น

การตั้งค่าปัจจุบันใช้การโค่นล้มสำหรับไฟล์การกำหนดค่า พื้นที่เก็บข้อมูลที่สอดคล้องกันดูเหมือนว่านี้

 / # root ของที่เก็บ
 + - www.domain.com/ # การกำหนดค่าสำหรับ www
 | \ - etc /
 | \ - apache2 /
 + - dev.domain.com/ # การกำหนดค่าสำหรับ dev
 | + - etc /
 | \ - เลือก /
 | \ - app1 /         
 | \ - การกำหนดค่า conf / # สำหรับ app1 บน dev
 \ - staging.domain.com/ # การกำหนดค่าสำหรับการแสดงละคร

ด้วยการโค่นล้มสิ่งนี้จะใช้ได้ดีเพราะเป็นไปได้ที่จะชำระเงินไดเรกทอรีย่อยของพื้นที่เก็บข้อมูล นอกจากนี้คุณสามารถใช้ svn: externals เพื่อชี้ไปที่โครงสร้างทั่วไปเดียวสำหรับการตั้งค่าการกำหนดค่าต่างๆ เราต้องจัดการกับไฟล์. svnในไดเรกทอรีที่มีเวอร์ชันทั้งหมดเท่านั้น Git ในทางกลับกันไม่มี svn: externalsและspout checkoutsต้องใช้พา ธ จากรูทไปยังไดเร็กตอรี่จริงที่เหมือนกันเสมอ

เมื่อพูดถึงการโยกย้ายไปยังคอมไพล์ฉันพยายามเขียนข้อกำหนดหลักสำหรับการกำหนดค่าเวอร์ชันเซิร์ฟเวอร์:

  • เราต้องการพื้นที่เก็บข้อมูลเดียว
  • มันเป็นไปได้ที่จะผลักดันการเปลี่ยนแปลงไปยังรีโมทส่วนกลางได้อย่างง่ายดาย
  • เซ็ตการแก้ไขควรมีผู้แต่งที่แท้จริง

มีวิธีที่ดีที่จะมีการกำหนดค่าทั้งหมดในที่เก็บเดียวและมีเส้นทางย่อยเป็นสำเนาการทำงานหรือไม่ ขณะนี้ฉันกำลังพิจารณาสองวิธี แต่ต้องการถามคำถามนี้ที่นี่ก่อน

  1. หากที่เก็บ. gitอยู่ในตำแหน่งคงที่เช่นที่ใดที่หนึ่งใน/ varเราสามารถลิงก์ไปยังพา ธ ย่อยจากไดเรกทอรีทำงาน "เป้าหมาย" ปัญหาหลัก: ฉันจะไม่ทราบวิธี "ลิงก์" จาก/ etcไปยังไดเรกทอรีอื่นเพื่อนำเข้าเนื้อหาเท่านั้นยกเว้น symlinking ไฟล์เดียว
  2. ฉันพบทางเลือกอื่นสำหรับคำถาม SO นี้ซึ่งแนะนำให้มีหลายสาขาในที่เก็บเดียว สิ่งนี้จะเพิ่มความซับซ้อนอย่างแน่นอน แต่ฉันเห็นว่าเราลองด้วยวิธีนี้

การใช้ git บนเครื่องเดียวสำหรับการจัดการไฟล์กำหนดค่าทำงานได้ดี แต่ฉันเชื่อว่าต้องมีใครบางคนที่ใช้มันในแบบที่เราต้องการจะใช้

ขอบคุณ
Kariem

คำตอบ:


14

ฉันเคยใช้อะไรแบบนี้มาก่อน นี่คือวิธีการทำงาน

ตั้งค่า Repo

  1. สร้าง repo คอมไพล์ "etc_files"
  2. สร้างสาขาสำหรับเครื่องแต่ละประเภทเช่น "เซิร์ฟเวอร์ / www", "เซิร์ฟเวอร์ / dev" ฯลฯ
    • git รองรับเครื่องหมายทับในชื่อสาขา สิ่งนี้ช่วยให้กิ่งไม้อยู่ในหัวของฉัน
    • หากคุณมีเครื่องจักรไม่เพียงพอคุณอาจมีสาขาสำหรับแต่ละเครื่องแทน
  3. สร้างสาขาสำหรับโครงสร้างพื้นฐานที่ใช้ร่วมกันแต่ละชิ้นเช่น "modules / apache", "modules / cups" ฯลฯ
    • /etc/resolv.confสาขาเหล่านี้สำหรับการถือครองไฟล์ที่เหมือนกันระหว่างเครื่องทั้งหมดเช่น นี่คือไฟล์ที่คุณเก็บไว้ใน repos "svn: externals" ตอนนี้

สร้างเครื่องจักรใหม่

  1. บนเครื่องใหม่ให้ลอกเลียนแบบ git repo และตรวจสอบสาขาสำหรับประเภทเครื่องนั้น
    • ฉันทำให้นี่เป็นโคลนแบบอ่านอย่างเดียวเพื่อป้องกันไม่ให้ผู้คนยอมรับการเปลี่ยนแปลงจากเครื่องจักรที่ผลิตโดยไม่ทำการทดสอบ
  2. ตั้งค่างาน cron git pullเป็น repo โดยอัตโนมัติทุกวัน

เปลี่ยนสาขาเครื่อง

การเปลี่ยนรหัสในสาขาเครื่องเดียวนั้นง่ายมาก เพียงแค่git checkoutสาขาที่เหมาะสมในสภาพแวดล้อมการพัฒนาของคุณทำการเปลี่ยนแปลงและส่งกลับไปยัง repo ส่วนกลาง เครื่องทั้งหมดในสาขานั้นจะได้รับการเปลี่ยนแปลงโดยอัตโนมัติในครั้งต่อไปที่งาน cron ทำงาน

การเปลี่ยนสาขาโมดูล

การเปลี่ยนรหัสสำหรับสาขาโมดูลนั้นมีความยุ่งยากเพียงเล็กน้อยเท่านั้นเนื่องจากมีสองขั้นตอน:

  1. git checkout สาขาโมดูลที่เหมาะสม
  2. ทำการเปลี่ยนแปลงของคุณและส่งไปยังเซิร์ฟเวอร์ส่วนกลาง
  3. git checkoutแต่ละเครื่องสาขาที่ใช้โมดูลสาขานั้นแล้วผสานสาขาโมดูลเข้าไป git จะเข้าใจว่าคุณได้รวมสาขาวิชานั้นไว้ก่อนและสังเกตเห็นเฉพาะการเปลี่ยนแปลงที่เกิดขึ้นตั้งแต่ผู้ปกครองทั่วไปคนสุดท้าย

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


อีกทางเลือกหนึ่ง git รุ่นใหม่รองรับสิ่งที่เรียกว่า " submodules ":

Submodules อนุญาตให้ที่เก็บต่างประเทศถูกฝังอยู่ภายในไดเรกทอรีย่อยเฉพาะของทรีซอร์สซึ่งชี้ไปที่การคอมมิตเฉพาะ

สิ่งนี้จะช่วยให้คุณสร้างบางสิ่งเล็กน้อยเช่นต้นไม้ "svn: externals" ซึ่งคุณสามารถอัปเดตได้ในแบบเดียวกับที่คุณทำตอนนี้


นี่เป็นรายละเอียดที่ละเอียดมากเกี่ยวกับทางเลือกที่ 2 ที่ฉันแนะนำในคำถามนี้ ที่ดี! อย่างไรก็ตามมันเป็นเรื่องยากที่จะใช้ความต้องการที่สอง (ผลักดันการเปลี่ยนแปลงกลับ) ถ้ารากที่เก็บจะต้องมี/เพราะการอนุญาตการเขียน
Kariem

คุณหมายถึงการอนุญาตให้เขียน / etc หรือไม่ หรือจะสามารถคอมมิทกับที่เก็บ? ฉันกลัวว่าฉันไม่เข้าใจว่าปัญหามาจากที่ใด
Handyman5

@ On a new machine, clone the git repo and check out the branch for that machine typeHandyman5: ฉันสามารถทำให้สาขาอื่นไม่สามารถเข้าถึงได้ (เพื่อเหตุผลด้านความปลอดภัย) หรือไม่
Eugene Yarmash

คุณสามารถใช้สิ่งนี้เพื่อส่งออกเนื้อหาของที่เก็บ git ไปยังเครื่อง จากนั้นแต่ละเครื่องจะไม่มีที่เก็บข้อมูลในนั้นเพียงแค่ไฟล์ในสาขาของมัน หากคุณต้องการผลักดันเซ็ตการแก้ไขไปยังรีโมทส่วนกลางจากแต่ละเครื่องฉันรู้ว่าไม่มีวิธีแก้ปัญหาที่มีทั้งที่เก็บเดียวและยังอนุญาตให้คุณตั้งค่าการควบคุมการเข้าถึงในสาขาต่าง ๆ บางทีคุณสามารถโค่นล้มบน http ด้วย. htaccess บน repo ได้ไหม ฉันไม่รู้เลยว่ามันใช้ได้ไหม
Handyman5

@ Handyman5: ดูเหมือนว่าการโค่นล้มในความเป็นจริงเป็นเครื่องมือที่เหมาะสมสำหรับงาน ขอบคุณสำหรับความช่วยเหลือของคุณ.
Eugene Yarmash

1

บิตของปุ่มนี่ แต่ฟังดูเหมือนว่าจะได้รับงานโพสต์

Repo master จะถูกเก็บไว้ใน / var / master
เบ็ดโคลนไปยัง / var / localclone
จากนั้นคัดลอกรายละเอียดเฉพาะโฮสต์
คุณจะต้องตั้งค่า. git / post-receive hook ในแต่ละเซิร์ฟเวอร์ (ด้วยการตั้งค่าที่เหมาะสม)

ดูเหมือนว่าคุณต้องการหุ่นเชิดหรือพ่อครัวมากกว่า git สำหรับสิ่งนี้จะทำให้คุณสามารถรัน git เพื่อจัดการ configs และโมดูลจากส่วนกลางและมี puppet \ chef จัดการการปรับใช้และการตรวจสอบสำหรับคุณ


1

นี่คือการทำงานอย่างรวดเร็วที่ฉันคิด
1 มีพื้นที่เก็บข้อมูลส่วนกลางในการพูด/var/repo
2 ใส่ไฟล์ที่เป็นส่วนกลางกับโดเมนทั้งหมดในไดเรกทอรีนั้น
3. สร้างสาขาทุกโดเมนย่อย/var/repo/subdomain1, /var/repo/subdomain2ฯลฯ
4. สร้างเบ็ดโพสต์ที่ผลักดันใด ๆ ไปยังสาขาที่มีการควบรวมกิจการกับต้นแบบ

ดังนั้นเมื่อคุณเปลี่ยนการตั้งค่าของ/var/repo/subdomain2มันจะถูกรวมเข้ากับมาสเตอร์ทันทีเพื่อให้คุณสามารถดึง repo ทั้งหมดและมีไฟล์ config ทั้งหมด
เมื่อคุณต้องการดึงการกำหนดค่าโดเมนย่อยแต่ละรายการเพียงดึงสาขาที่เหมาะสม

คุณจะนำไฟล์ปรับแต่งของคุณไปใช้ใน/var/repo/*เรื่องอื่นได้อย่างไร (แท็บ cron ฉันคิดได้)

~ $

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.