Gunakan git untuk beberapa file konfigurasi server

14

Kami telah memigrasi banyak kode sumber ke git dan sangat senang dengan solusi kami saat ini. Kami ingin agar file konfigurasi server kami diversi versi pada sistem yang sama, tetapi ada beberapa hal yang tidak berfungsi seperti yang kami inginkan dan saya harap seseorang dapat membagikan pengalamannya di sini.

Pertanyaan ini mirip dengan Menggunakan kontrol revisi untuk file konfigurasi server? , tetapi kami memiliki beberapa persyaratan khusus yang tidak berfungsi dengan saran pada pertanyaan itu.

Pengaturan saat ini menggunakan subversi untuk file konfigurasi. Repositori yang sesuai terlihat seperti ini

 / # root repositori
 + - www.domain.com/ # konfigurasi untuk www
 | \ - dll /
 | \ - apache2 /
 + - dev.domain.com/ # konfigurasi untuk dev
 | + - dll /
 | \--memilih/
 | \ - app1 /         
 | konfigurasi \ - conf / # untuk app1 di dev
 \ - staging.domain.com/ # konfigurasi untuk staging

Dengan subversi ini akan berfungsi dengan baik, karena mungkin saja checkout sub-direktori repositori. Selain itu Anda dapat menggunakan svn: eksternal untuk menunjuk ke satu struktur umum untuk beberapa pengaturan konfigurasi yang berbeda. Kami hanya harus berurusan dengan file .svn di semua direktori berversi. Git di sisi lain tidak memiliki svn: pemeriksaan eksternal dan jarang selalu memerlukan jalur dari root ke direktori aktual agar sama.

Ketika membahas migrasi ke git, saya mencoba menuliskan Persyaratan utama untuk versi konfigurasi server:

  • kami hanya ingin satu repositori
  • harus dimungkinkan untuk dengan mudah mendorong perubahan ke remote pusat
  • perubahan harus berisi penulis asli

Apakah ada cara yang baik untuk memiliki semua konfigurasi dalam satu repositori dan hanya memiliki sub-path sebagai copy pekerjaan? Saat ini saya sedang mempertimbangkan dua pendekatan, tetapi ingin menanyakan pertanyaan ini terlebih dahulu

  1. Jika repositori .git berada di lokasi yang tetap, misalnya di suatu tempat di / var , kita bisa menautkan ke sub-path dari direktori kerja "target". Masalah utama: Saya tidak akan tahu cara untuk "menautkan" dari / etc ke direktori lain untuk hanya mengimpor konten, kecuali menghubungkan satu file.
  2. Saya menemukan alternatif lain pada pertanyaan SO ini , menyarankan untuk memiliki beberapa cabang dalam satu repositori. Ini tentunya akan menambah kerumitan, tetapi saya bisa melihat kami mencoba cara ini.

Menggunakan git pada satu mesin untuk manajemen file konfigurasi berfungsi dengan baik, tapi saya percaya pasti ada seseorang yang menggunakannya dengan cara yang ingin kita gunakan.


Kariem terima kasih

Kariem
sumber

Jawaban:

14

Saya telah menggunakan sesuatu seperti ini sebelumnya; ini cara kerjanya.

Pengaturan Repo

  1. Buat git repo, "etc_files".
  2. Buat cabang untuk setiap jenis mesin, misalnya, "server / www", "server / dev", dll.
    • git mendukung garis miring pada nama cabang. Ini membantu saya menjaga cabang lurus di kepala saya.
    • Jika Anda memiliki beberapa mesin yang cukup, Anda bisa memiliki cabang untuk masing-masing mesin.
  3. Buat cabang untuk setiap bagian infrastruktur bersama, misalnya "modul / apache", "modul / cangkir", dll.
    • Cabang-cabang ini untuk menyimpan file yang sama antara semua mesin, seperti /etc/resolv.conf. Ini akan menjadi file yang Anda simpan di repo "svn: externals" sekarang.

Membangun Mesin Baru

  1. Pada mesin baru, klon repo git dan periksa cabang untuk jenis mesin itu.
    • Saya menjadikan ini klon baca-saja untuk mencegah orang melakukan perubahan dari mesin produksi tanpa pengujian.
  2. Atur pekerjaan cron untuk git pullrepo secara otomatis setiap hari.

Mengubah Cabang Mesin

Mengubah kode di cabang mesin tunggal itu sederhana; hanya git checkoutcabang yang sesuai di lingkungan pengembangan Anda, buat perubahan, dan komit kembali ke repo pusat. Semua mesin di cabang itu akan secara otomatis mendapatkan perubahan saat pekerjaan cron berikutnya dijalankan.

Mengubah Cabang Modul

Mengubah kode untuk cabang modul hanya sedikit lebih rumit, karena melibatkan dua langkah:

  1. git checkout cabang modul yang sesuai
  2. Buat perubahan Anda dan komit ke server terpusat.
  3. git checkoutsetiap cabang mesin yang menggunakan cabang modul itu, dan kemudian menggabungkan cabang modul ke dalamnya. git akan mengetahui bahwa Anda telah menggabungkan cabang modul itu sebelumnya dan hanya memperhatikan perubahan yang telah terjadi sejak orang tua umum terakhir itu.

Metode ini memiliki kelebihan dan kekurangan. Satu manfaat adalah bahwa saya dapat membuat perubahan ke cabang modul dan menerapkannya ke cabang mesin yang membutuhkannya, yang membiarkan cabang mesin yang tidak tetap dengan versi yang lebih lama sampai mereka siap. Kekurangannya adalah Anda harus ingat untuk menggabungkan cabang modul Anda ke setiap cabang mesin yang mungkin menggunakannya. Saya menggunakan skrip yang melintasi pohon komit dan secara otomatis melakukan penggabungan ini untuk saya, tetapi masih bisa menyebalkan.


Sebagai alternatif, git versi terbaru mendukung sesuatu yang disebut " submodules ":

Submodules memungkinkan repositori asing untuk tertanam di dalam subdirektori khusus pohon sumber, selalu menunjuk komit tertentu.

Ini akan memungkinkan Anda untuk membangun sesuatu yang sedikit seperti pohon "svn: externals", yang kemudian dapat Anda perbarui dengan cara yang sama seperti yang Anda lakukan sekarang.

Handyman5
sumber
Ini adalah uraian yang sangat rinci tentang alternatif 2 yang saya sarankan dalam pertanyaan. Bagus! Namun, sulit untuk menerapkan persyaratan kedua (mendorong perubahan kembali), jika root repositori harus ada /karena izin tulis.
Kariem
Apakah maksud Anda menulis izin ke / etc? Atau untuk dapat mengkomit ke repositori? Saya khawatir saya tidak mengerti dari mana masalah itu berasal.
Handyman5
@ Handyman5: On a new machine, clone the git repo and check out the branch for that machine type. Bisakah saya membuat cabang lain tidak dapat diakses (untuk alasan keamanan)?
Eugene Yarmash
Anda dapat menggunakan sesuatu seperti ini untuk mengekspor konten repositori git ke mesin. Maka setiap mesin tidak akan memiliki repositori di atasnya, hanya file di cabangnya. Jika Anda ingin mendorong perubahan ke remote pusat dari setiap mesin, saya tahu tidak ada solusi yang memiliki repositori tunggal dan juga memungkinkan Anda untuk mengatur kontrol akses di berbagai cabang. Mungkin Anda bisa melakukan Subversi melalui http dengan .htaccess di repo? Saya tidak tahu apakah itu berhasil.
Handyman5
@ Handyman5: Tampaknya subversi sebenarnya adalah alat yang tepat untuk tugas tersebut. Terima kasih atas bantuan Anda.
Eugene Yarmash
1

Agak sulit di sini tapi Kedengarannya seperti kail penerima pos bisa melakukan pekerjaan

Master repo disimpan di / var / master
klon pengait ke / var / localclone
lalu menyalin rincian spesifik host.
Anda perlu mengatur hook .git / pasca-terima secara lokal di setiap server (dengan pengaturan yang sesuai)

Ini juga terdengar seperti Anda menginginkan sesuatu yang lebih seperti boneka atau koki daripada git untuk ini, ini akan memungkinkan Anda untuk menjalankan git untuk mengelola konfigurasi dan modul secara terpusat dan meminta koki wayang \ mengelola penyebaran dan verifikasi untuk Anda

Tacticus
sumber
1

di sini adalah pekerjaan cepat yang saya pikirkan
1. Memiliki repositori pusat di katakan /var/repo
2. Masukkan file yang bersifat global ke semua domain di direktori itu.
3. Buat cabang untuk setiap subdomain /var/repo/subdomain1, /var/repo/subdomain2dll.
4. Buat kait pos di mana setiap dorongan ke cabang digabung dengan master.

Jadi ketika Anda mengubah konfigurasi /var/repo/subdomain2itu segera digabungkan dengan master sehingga Anda dapat menarik repo sepenuhnya dan memiliki semua file konfigurasi
Ketika Anda ingin menarik konfigurasi subdomain individu, cukup tarik cabang yang sesuai.

Bagaimana Anda memasukkan file konfigurasi Anda ke masalah /var/repo/*yang sama sekali berbeda (tab cron, saya bisa memikirkan)

~ $

Sudhi
sumber