Birden çok sunucu yapılandırma dosyası için git kullanma


14

Git için birçok kaynak kodunu taşıdık ve mevcut çözümümüzden çok memnunuz. Sunucu yapılandırma dosyalarımızın aynı sistemde sürümlendirilmesini istiyoruz, ancak bizim istediğimiz gibi çalışmayan birkaç şey var ve umarım birisi deneyimlerini burada paylaşabilir.

Bu soru, sunucu yapılandırma dosyaları için revizyon denetimi kullanılmasına benzer ? , ancak bu soruya ilişkin önerilerle çalışmayan bazı özel gereksinimlerimiz var.

Geçerli kurulum, yapılandırma dosyaları için alt sürüm kullanır. Karşılık gelen depo şuna benzer

 / # havuzun kökü
 + - www için www.domain.com/ # yapılandırma
 | \--vb/
 | \ - apache2 /
 + - dev.domain.com/ # dev için yapılandırma
 | + - vs /
 | \ - opt /
 | \ - app1 /         
 | \ - geliştirmede app1 için conf / # yapılandırması
 \ - staging.domain.com/ # hazırlama için yapılandırma

Subversion ile bu sadece işe yarayacaktır, çünkü sadece bir deponun alt dizinini kontrol etmek mümkündür. Ayrıca, birkaç farklı yapılandırma kurulumu için ortak bir yapıyı göstermek için svn: externals komutunu kullanabilirsiniz. Sadece tüm sürüm dizinlerinde .svn dosyaları ile uğraşmak zorunda kaldık . Git'in ise svn: externals ve seyrek check-out'ları her zaman kökten gerçek dizine giden yolun aynı olmasını gerektirir.

Git'e geçişi tartışırken, sunucu yapılandırması sürümlendirmesi için ana Gereksinimleri yazmaya çalıştım :

  • sadece tek bir depo istiyoruz
  • değişiklikleri merkezi uzaktan kumandaya kolayca itmek mümkün olmalıdır
  • değişiklik kümeleri gerçek yazarı içermelidir

Tüm yapılandırmayı bir depoda bulundurmanın ve yalnızca çalışan kopya olarak bir alt yola sahip olmanın güzel bir yolu var mı? Şu anda iki yaklaşımı düşünüyorum ama önce bu soruyu burada sormak istedim

  1. Eğer .git depo sabit yerdedir, örneğin bir yerlerde / var , biz çalışma dizini "hedef" dan alt yola link verebilecek. Ana sorun: Tek dosyaları symlinking hariç, sadece içeriği almak için / etc başka bir dizine "bağlantı" için bir yol bilmiyordum
  2. Bu SO sorusunda başka bir alternatif buldum, bu da bir depoda birden fazla şubeye sahip olduğumu düşündürüyor. Bu kesinlikle karmaşıklığı artıracaktır, ama bizi bu şekilde denerken görebiliyordum.

Yapılandırma dosya yönetimi için tek bir makinede git kullanmak iyi çalışıyor, ancak onu kullanmak istediğimiz şekilde kullanan birinin olması gerektiğine inanıyorum.

Teşekkür ederim
Kariem

Yanıtlar:


14

Daha önce böyle bir şey kullandım; işte böyle çalıştı.

Repo Kurulumu

  1. Git deposu "etc_files" oluşturun.
  2. Her makine türü için bir şube oluşturun, örneğin "sunucu / www", "sunucu / dev" vb.
    • git, şube adlarındaki eğik çizgileri destekler. Bu dalları doğrudan kafamda tutmama yardımcı oluyor.
    • Yeterli sayıda makineniz yoksa, bunun yerine her bir makine için bir şubeniz olabilir.
  3. Her paylaşılan altyapı parçası için bir şube oluşturun, örneğin "modüller / apache", "modüller / kaplar" vb.
    • Bu dallar, tüm makineler arasında aynı olan dosyaları tutmak içindir /etc/resolv.conf. Bunlar şimdi "svn: externals" depolarında tuttuğunuz dosyalar olacaktır.

Yeni Bir Makine İnşa Etmek

  1. Yeni bir makinede, git deposunu kopyalayın ve bu makine türü için şubeye bakın.
    • İnsanların test yapmadan üretim makinelerinden değişiklik yapmalarını önlemek için bunu salt okunur bir klon haline getiriyorum.
  2. git pullHer gün otomatik olarak repo oluşturmak için bir cron işi ayarlayın .

Makine Kollarını Değiştirme

Tek bir makine kolundaki kodun değiştirilmesi basittir; sadece git checkoutgeliştirme ortamınızdaki uygun şube, değişiklikleri yapın ve merkezi repoya geri verin. Bu daldaki tüm makineler, cron işi bir sonraki çalıştırıldığında değişiklikleri otomatik olarak alacaktır.

Modül Dallarını Değiştirme

Bir modül dalının kodunu değiştirmek, iki adım içerdiğinden sadece biraz daha zordur:

  1. git checkout uygun modül dalı
  2. Değişikliklerinizi yapın ve bunları merkezi sunucuya teslim edin.
  3. git checkoutbu modül dalını kullanan her makine dalı ve sonra modül dalını içine birleştirin. git modül modülünü daha önce birleştirdiğinizi anlar ve yalnızca son ortak ana öğeden bu yana meydana gelen değişiklikleri fark eder.

Bu yöntemin hem faydaları hem de dezavantajları vardır. Bunun bir avantajı, bir modül dalında değişiklik yapabilmem ve onu ihtiyaç duyan makine dallarına uygulayabilmemdir. Bunun dezavantajı, modül dalınızı kullanabilecek her makine dalına birleştirmeyi hatırlamanız gerektiğidir. Taahhüt ağacından geçen ve otomatik olarak bu birleştirmeyi benim için yapan bir komut dosyası kullanıyorum, ancak yine de bir acı olabilir.


Alternatif olarak, git'in yeni sürümleri " alt modüller " olarak adlandırılan bir şeyi destekler :

Alt modüller, yabancı havuzların her zaman belirli bir taahhüde işaret eden kaynak ağacın özel bir alt dizinine yerleştirilmesine izin verir.

Bu, "svn: externals" ağaçları gibi bir şey oluşturmanıza izin verir, bu da şimdi yaptığınız gibi güncelleyebilirsiniz.


Bu, soruda önerdiğim alternatif 2 hakkında çok ayrıntılı bir ayrıntı. Harika! Ancak, veri havuzu kökünün /yazma izinleri nedeniyle olması gerekiyorsa, ikinci gereksinimi uygulamak (değişiklikleri geri itmek) zordur .
Kariem

/ Etc yazma izinleri mi demek istediniz? Ya da depoya bağlanabilmek için mi? Korkarım sorunun nereden geldiğini anlamıyorum.
Tamirci5

@ Handyman5: On a new machine, clone the git repo and check out the branch for that machine type. Diğer şubelere erişemez miyim (güvenlik nedeniyle)?
Eugene Yarmash

Git deposunun içeriğini makinelere vermek için böyle bir şey kullanabilirsiniz . O zaman her makinenin üzerinde depo olmaz, sadece kendi dalındaki dosyalar. Değişiklik setlerini her makineden merkezi uzaktan kumandaya itmek istiyorsanız, hem tek bir deposu olan hem de çeşitli dallarda erişim kontrolleri ayarlamanıza izin veren bir çözüm bilmiyorum. Belki Repo üzerinde .htaccess ile http üzerinden Subversion yapabilirdi? Bunun işe yarayıp yaramadığını bilmiyorum.
Tamirci5

@ Tamirci5: Yıkımın aslında görev için doğru araç olduğu anlaşılıyor. Yardımın için teşekkürler.
Eugene Yarmash

1

Burada bir çıkıntı biraz var ama bir posta alma kanca iş yapabilir gibi geliyor

Repo master, / var / master
dizininde saklanır ve / var / localclone dizinine kopyalanır,
daha sonra ana bilgisayara özel ayrıntıları kopyalar
.git / post-alma kancasını her sunucuda yerel olarak ayarlamanız gerekir (uygun ayarlarla)

Aynı zamanda git yerine kukla veya şef gibi bir şey istediğiniz gibi geliyor, bu da konfigürasyonları ve modülleri merkezi olarak yönetmek için git çalıştırmanıza ve sizin için konuşlandırmayı ve doğrulamayı yönetmenize izin verecektir.


1

İşte ben düşündüm hızlı bir çalışmadır
1. diyelim merkezi bir havuz var /var/repo
2. Bu dizindeki tüm etki alanları için küresel dosyaları koyun.
Her alt alan adı için şube oluşturma 3. /var/repo/subdomain1, /var/repo/subdomain2vb
4. dalına herhangi bir push usta ile birleştirilir bir post kanca oluşturun.

Bu nedenle, yapılandırmayı değiştirdiğinizde /var/repo/subdomain2hemen master ile birleştirilir, böylece repoyu tamamen çekebilir ve tüm yapılandırma dosyalarına sahip olabilir
.

Nasıl yapılandırma dosyaları içine koymak /var/repo/*tamamen farklı bir konudur (cron sekmeleri, düşünebilirsiniz)

~ $

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.