Sử dụng git cho nhiều tệp cấu hình máy chủ


14

Chúng tôi đã di chuyển rất nhiều mã nguồn sang git và rất hài lòng với giải pháp hiện tại của chúng tôi. Chúng tôi muốn có các tệp cấu hình máy chủ của chúng tôi được phiên bản trên cùng một hệ thống, nhưng có một số điều không hoạt động theo cách chúng tôi muốn và tôi hy vọng ai đó có thể chia sẻ kinh nghiệm của mình ở đây.

Câu hỏi này tương tự như Sử dụng kiểm soát sửa đổi cho các tệp cấu hình máy chủ? , nhưng chúng tôi có một số yêu cầu đặc biệt không hoạt động với các đề xuất về câu hỏi đó.

Thiết lập hiện tại sử dụng subversion cho các tập tin cấu hình. Kho tương ứng trông giống như thế này

 / # root của kho lưu trữ
 + - www.domain.com/ # cấu hình cho www
 | \--Vân vân/
 | \ - apache2 /
 + - dev.domain.com/ # cấu hình cho dev
 | + - v.v /
 | \--opt/
 | \ - ứng dụng1 /         
 | \ - conf / # cấu hình cho app1 trên dev
 \ - staging.domain.com/ # cấu hình để dàn dựng

Với lật đổ, điều này sẽ hoạt động tốt, bởi vì có thể chỉ cần kiểm tra một thư mục con của kho lưu trữ. Ngoài ra, bạn có thể sử dụng svn: externals để trỏ đến một cấu trúc chung cho một số thiết lập cấu hình khác nhau. Chúng tôi chỉ phải xử lý các tệp .svn trong tất cả các thư mục được phiên bản. Mặt khác, Git không có svn: externalskiểm tra thưa thớt luôn yêu cầu đường dẫn từ thư mục gốc đến thư mục thực tế phải giống nhau.

Khi thảo luận về việc di chuyển sang git, tôi đã cố gắng viết ra các Yêu cầu chính cho phiên bản cấu hình máy chủ:

  • chúng tôi chỉ muốn một kho lưu trữ duy nhất
  • có thể dễ dàng đẩy các thay đổi đến điều khiển từ xa trung tâm
  • thay đổi nên chứa tác giả thực sự

Có một cách hay để có tất cả cấu hình trong một kho lưu trữ và chỉ có một đường dẫn phụ là bản sao làm việc? Hiện tại tôi đang xem xét hai cách tiếp cận, nhưng muốn đặt câu hỏi này ở đây trước

  1. Nếu kho lưu trữ .git ở một vị trí cố định, ví dụ: ở đâu đó trong / var , chúng ta có thể liên kết đến đường dẫn phụ từ thư mục làm việc "đích". Vấn đề chính: Tôi sẽ không biết cách "liên kết" từ / etc đến thư mục khác để chỉ nhập nội dung, ngoại trừ các tệp đơn liên kết tượng trưng
  2. Tôi tìm thấy một lựa chọn khác cho câu hỏi SO này , đề nghị có nhiều nhánh trong một kho lưu trữ. Điều này chắc chắn sẽ làm tăng sự phức tạp, nhưng tôi có thể thấy chúng tôi đang thử theo cách này.

Sử dụng git trên một máy duy nhất để quản lý tệp cấu hình hoạt động tốt, nhưng tôi tin rằng phải có ai đó đang sử dụng nó theo cách chúng tôi muốn sử dụng.

Cảm ơn bạn
Kariem

Câu trả lời:


14

Tôi đã từng sử dụng một cái gì đó như thế này trước đây; đây là cách nó hoạt động

Cài đặt lại

  1. Tạo một repo git, "etc_files".
  2. Tạo một nhánh cho từng loại máy, ví dụ: "server / www", "server / dev", v.v.
    • git hỗ trợ dấu gạch chéo trong tên chi nhánh. Điều này giúp tôi giữ các nhánh thẳng trong đầu.
    • Nếu bạn có ít máy, bạn có thể có một chi nhánh cho từng máy riêng lẻ.
  3. Tạo một nhánh cho mỗi phần của cơ sở hạ tầng dùng chung, ví dụ: "mô-đun / apache", "mô-đun / cốc", v.v.
    • Các nhánh này để giữ các tệp giống nhau giữa tất cả các máy, như /etc/resolv.conf. Đây sẽ là các tệp bạn giữ trong repos "svn: externals" ngay bây giờ.

Xây dựng một máy mới

  1. Trên một máy mới, sao chép git repo và kiểm tra chi nhánh cho loại máy đó.
    • Tôi biến nó thành một bản sao chỉ đọc để ngăn mọi người thực hiện các thay đổi từ các máy sản xuất mà không cần thử nghiệm.
  2. Thiết lập một công việc định kỳ để tự động git pullrepo mỗi ngày.

Thay đổi chi nhánh máy

Thay đổi mã trong một nhánh máy đơn giản; chỉ git checkoutlà nhánh thích hợp trong môi trường phát triển của bạn, thực hiện các thay đổi và đưa chúng trở lại repo trung tâm. Tất cả các máy trong nhánh đó sẽ tự động nhận được các thay đổi vào lần tiếp theo công việc định kỳ chạy.

Thay đổi chi nhánh mô-đun

Thay đổi mã cho một nhánh mô-đun chỉ khó hơn một chút, vì nó bao gồm hai bước:

  1. git checkout nhánh mô-đun thích hợp
  2. Thực hiện các thay đổi của bạn và cam kết chúng với máy chủ tập trung.
  3. git checkoutmỗi nhánh máy sử dụng nhánh mô-đun đó, sau đó hợp nhất nhánh mô-đun vào nó. git sẽ chỉ ra rằng bạn đã hợp nhất nhánh mô-đun đó trước đó và chỉ nhận thấy những thay đổi đã xảy ra kể từ lần cha mẹ chung cuối cùng đó.

Phương pháp này có cả lợi ích và nhược điểm. Một lợi ích là tôi có thể thay đổi một nhánh mô-đun và áp dụng nó cho các nhánh máy cần nó, cho phép các nhánh máy không ở lại với phiên bản cũ hơn cho đến khi chúng sẵn sàng. Hạn chế là bạn phải nhớ hợp nhất nhánh mô-đun của mình vào từng nhánh máy có thể đang sử dụng nó. Tôi sử dụng một tập lệnh đi ngang qua cây cam kết và tự động thực hiện việc hợp nhất này cho tôi, nhưng vẫn có thể là một nỗi đau.


Thay vào đó, các phiên bản mới hơn của git hỗ trợ một cái gì đó gọi là " mô đun con ":

Các mô hình con cho phép các kho lưu trữ nước ngoài được nhúng trong một thư mục con chuyên dụng của cây nguồn, luôn luôn chỉ vào một cam kết cụ thể.

Điều này sẽ cho phép bạn xây dựng một cái gì đó giống như cây "svn: externals", sau đó bạn có thể cập nhật theo cách tương tự như bạn làm bây giờ.


Đây là một chi tiết rất chi tiết về phương án 2 tôi đã đề xuất trong câu hỏi. Tuyệt quá! Tuy nhiên, rất khó để thực hiện yêu cầu thứ hai (đẩy các thay đổi trở lại), nếu gốc kho lưu trữ phải ở trong /vì quyền ghi.
Kariem

Bạn có nghĩa là viết quyền cho / etc? Hoặc để có thể cam kết với kho lưu trữ? Tôi sợ tôi không hiểu vấn đề đến từ đâu.
Handyman5

@ Handyman5 : On a new machine, clone the git repo and check out the branch for that machine type. Tôi có thể làm cho các chi nhánh khác không thể truy cập (vì lý do bảo mật) không?
Eugene Yarmash

Bạn có thể sử dụng một cái gì đó như thế này để xuất nội dung của kho git sang các máy. Sau đó, mỗi máy sẽ không có kho lưu trữ trên đó, chỉ các tệp trong nhánh của nó. Tuy nhiên, nếu bạn muốn đẩy các thay đổi vào điều khiển trung tâm từ mỗi máy, tôi biết không có giải pháp nào có cả kho lưu trữ duy nhất và cũng cho phép bạn thiết lập các điều khiển truy cập trên các nhánh khác nhau. Có lẽ bạn có thể thực hiện Subversion qua http với .htaccess trên repo? Tôi không biết nếu nó hoạt động.
Handyman5

@ Handyman5: Có vẻ như lật đổ trên thực tế là công cụ phù hợp cho nhiệm vụ. Cảm ơn bạn đã giúp đỡ.
Eugene Yarmash

1

Bit của một nub ở đây nhưng có vẻ như một bài nhận móc có thể thực hiện công việc

Repo master được lưu trữ trong / var / master
hook nhân bản nó thành / var / localclone
sau đó sao chép chi tiết cụ thể của máy chủ
Bạn sẽ cần thiết lập hook .git / post-receive cục bộ trên mỗi máy chủ (với các cài đặt phù hợp)

Có vẻ như bạn muốn một cái gì đó giống như con rối hoặc đầu bếp hơn là git vì điều này sẽ cho phép bạn chạy git để quản lý các cấu hình và mô-đun tập trung và có rối \ đầu bếp quản lý việc triển khai và xác minh cho bạn


1

Đây là một công việc nhanh chóng mà tôi nghĩ đến
1. Có một kho lưu trữ trung tâm nói /var/repo
2. Đặt các tệp là toàn cầu cho tất cả các tên miền trong thư mục đó.
3. Tạo các nhánh cho mọi tên miền phụ /var/repo/subdomain1, /var/repo/subdomain2v.v ...
4. Tạo một bài đăng trong đó bất kỳ sự thúc đẩy nào đến chi nhánh được hợp nhất với chủ.

Vì vậy, khi bạn thay đổi cấu hình của /var/repo/subdomain2nó, nó sẽ được hợp nhất ngay lập tức với master để bạn có thể kéo toàn bộ repo và có tất cả các tệp cấu hình
Khi bạn muốn kéo các cấu hình tên miền phụ riêng lẻ, chỉ cần kéo nhánh thích hợp.

Làm thế nào để bạn đặt các tập tin cấu hình của bạn vào /var/repo/*là vấn đề hoàn toàn khác nhau (các tab cron, tôi có thể nghĩ ra)

~ $

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.