कई सर्वर कॉन्फ़िगरेशन फ़ाइलों के लिए git का उपयोग करें


14

हमने कई स्रोत कोड को जीआईटी पर माइग्रेट कर दिया है और हमारे मौजूदा समाधान से बहुत खुश हैं। हम चाहते हैं कि हमारी सर्वर कॉन्फ़िगरेशन फ़ाइलें उसी सिस्टम पर संस्करणबद्ध हों, लेकिन कुछ चीजें हैं जो उस तरह से काम नहीं करती हैं जैसे हम इसे करना चाहते हैं और मुझे उम्मीद है कि कोई व्यक्ति यहां अपना अनुभव साझा कर सकता है।

यह प्रश्न सर्वर कॉन्फ़िगरेशन फ़ाइलों के लिए संशोधन नियंत्रण का उपयोग करने के समान है ? , लेकिन हमारे पास कुछ विशेष आवश्यकताएं हैं जो उस प्रश्न पर सुझावों के साथ काम नहीं करते हैं।

वर्तमान सेटअप कॉन्फ़िगरेशन फ़ाइलों के लिए तोड़फोड़ का उपयोग करता है। संबंधित रिपॉजिटरी कुछ इस तरह दिखती है

 / # भंडार का मूल
 + - www.domain.com/ # www के लिए कॉन्फ़िगरेशन
 | \--आदि/
 | \ - apache2 /
 + - dev.domain.com/ # देव के लिए विन्यास
 | + - etc /
 | \ - opt /
 | \ - APP1 /         
 | देव पर app1 के लिए \ / conf / # कॉन्फ़िगरेशन
 मंचन के लिए \ - staging.domain.com/ # कॉन्फ़िगरेशन

तोड़फोड़ के साथ यह ठीक काम करेगा, क्योंकि एक रिपॉजिटरी की उप-निर्देशिका को चेकआउट करना संभव है। इसके अलावा आप कई अलग-अलग कॉन्फ़िगरेशन सेटअपों के लिए एक सामान्य संरचना को इंगित करने के लिए svn: externals का उपयोग कर सकते हैं। हमें केवल सभी संस्करण निर्देशिकाओं में .svn फ़ाइलों से निपटना था । दूसरी ओर Git में svn नहीं है: बाहरी और विरल चेकआउट को हमेशा रूट से वास्तविक निर्देशिका के समान होने के लिए पथ की आवश्यकता होती है।

जब माइग्रेशन पर चर्चा करने के लिए, मैंने सर्वर कॉन्फ़िगरेशन संस्करण के लिए मुख्य आवश्यकताएँ लिखने की कोशिश की :

  • हम केवल एक ही भंडार चाहते हैं
  • केंद्रीय रिमोट में परिवर्तनों को आसानी से धकेलना संभव होना चाहिए
  • परिवर्तनों में वास्तविक लेखक होना चाहिए

क्या एक रिपॉजिटरी में सभी कॉन्फ़िगरेशन के लिए एक अच्छा तरीका है और केवल काम करने वाले कॉपी के रूप में एक उप-पथ है? वर्तमान में मैं दो दृष्टिकोणों पर विचार कर रहा हूं, लेकिन पहले यहां यह प्रश्न पूछना चाहता था

  1. यदि .git रिपॉजिटरी एक निश्चित स्थान पर है, जैसे कि / var में , हम "लक्ष्य" वर्किंग डायरेक्टरी से सब-पाथ से लिंक कर सकते हैं। मुख्य समस्या: मैं केवल सामग्री को आयात करने के लिए किसी अन्य निर्देशिका के लिए " आदि " से "लिंक" करने का एक तरीका नहीं जानता , सिवाय एकल फ़ाइलों को सिम्लिंक करने के
  2. मुझे इस एसओ प्रश्न पर एक और विकल्प मिला , एक रिपॉजिटरी में कई शाखाएं होने का सुझाव। यह निश्चित रूप से जटिलता को बढ़ाएगा, लेकिन मैं हमें इस तरह से प्रयास करते हुए देख सकता हूं।

कॉन्फ़िगरेशन फ़ाइल प्रबंधन के लिए एक मशीन पर गिट का उपयोग करना ठीक काम करता है, लेकिन मेरा मानना ​​है कि कोई ऐसा व्यक्ति होना चाहिए जो इसका उपयोग करना चाहता है।

धन्यवाद
कारीम

जवाबों:


14

मैंने पहले भी कुछ ऐसा प्रयोग किया है; यह है कि यह कैसे काम किया।

रेपो सेटअप

  1. एक git रेपो, "etc_files" बनाएं।
  2. प्रत्येक मशीन के प्रकार के लिए एक शाखा बनाएं, जैसे, "सर्वर / www", "सर्वर / देव", आदि।
    • git शाखा नामों में स्लैश का समर्थन करता है। इससे मुझे अपने सिर में शाखाओं को सीधा रखने में मदद मिलती है।
    • यदि आपके पास कुछ पर्याप्त मशीनें हैं, तो आपके पास प्रत्येक व्यक्तिगत मशीन के लिए एक शाखा हो सकती है।
  3. साझा बुनियादी ढांचे के प्रत्येक टुकड़े के लिए एक शाखा बनाएं, जैसे "मॉड्यूल / एपाचे", "मॉड्यूल / कप", आदि।
    • ये शाखाएँ उन फ़ाइलों को रखने के लिए हैं जो सभी मशीनों के बीच समान हैं, जैसे /etc/resolv.conf। ये वो फाइलें होंगी जो आप "svn: externals" रिपोज में रखते हैं।

एक नई मशीन का निर्माण

  1. एक नई मशीन पर, गिट रेपो को क्लोन करें और उस मशीन के प्रकार के लिए शाखा देखें।
    • मैं इसे बिना किसी परीक्षण के उत्पादन मशीनों से परिवर्तन करने से रोकने के लिए केवल-पढ़ने के लिए क्लोन बनाता हूं।
  2. git pullप्रत्येक दिन रेपो को स्वचालित रूप से क्रोन जॉब सेट करें ।

मशीन शाखाओं को बदलना

एकल मशीन शाखा में कोड बदलना सरल है; git checkoutअपने विकास के माहौल में सिर्फ उचित शाखा, परिवर्तन करें, और उन्हें केंद्रीय रेपो में वापस करें। अगली बार क्रोन जॉब चलने पर उस ब्रांच की सभी मशीनें अपने आप बदलाव लाएंगी।

मॉड्यूल शाखाओं में बदलना

मॉड्यूल शाखा के लिए कोड बदलना केवल थोड़ा और मुश्किल है, क्योंकि इसमें दो चरण शामिल हैं:

  1. git checkout उपयुक्त मॉड्यूल शाखा
  2. अपने परिवर्तन करें और उन्हें केंद्रीकृत सर्वर पर भेजें।
  3. git checkoutप्रत्येक मशीन शाखा जो उस मॉड्यूल शाखा का उपयोग करती है, और फिर मॉड्यूल शाखा को उसमें मिला देती है। git यह पता लगाएगा कि आपने उस मॉड्यूल शाखा को पहले विलय कर दिया है और केवल पिछले आम माता-पिता के बाद हुए परिवर्तनों को नोटिस किया है।

इस पद्धति के लाभ और कमियां दोनों हैं। एक लाभ यह है कि मैं एक मॉड्यूल शाखा में परिवर्तन कर सकता हूं और इसे उन मशीन शाखाओं पर लागू कर सकता हूं जिनकी आवश्यकता है, जो मशीन शाखाओं को पुराने संस्करण के साथ रहने तक तैयार नहीं होने देते हैं। फिर, यह है कि आपको अपनी मॉड्यूल शाखा को प्रत्येक मशीन शाखा में मर्ज करना याद रखना होगा जो इसका उपयोग कर रही हो। मैं एक स्क्रिप्ट का उपयोग करता हूं जो प्रतिबद्ध पेड़ का पता लगाता है और स्वचालित रूप से मेरे लिए यह विलय करता है, लेकिन फिर भी दर्द हो सकता है।


एक विकल्प के रूप में, git के नए संस्करण " सबमॉड्यूल्स " का समर्थन करते हैं :

सबमॉड्यूल्स विदेशी रिपोजिटरी को स्रोत पेड़ के एक समर्पित उपनिर्देशिका के भीतर एम्बेड करने की अनुमति देते हैं, हमेशा एक विशेष प्रतिबद्ध पर इंगित किया जाता है।

यह आपको "svn: externals" पेड़ों की तरह थोड़ा सा कुछ बनाने की अनुमति देगा, जिसे आप तब उसी तरह से अपडेट कर सकते हैं जैसे आप अभी करते हैं।


यह वैकल्पिक 2 पर एक बहुत विस्तृत विस्तार है जो मैंने प्रश्न में सुझाया था। महान! हालांकि, दूसरी आवश्यकता को लागू करना मुश्किल है (परिवर्तन को पीछे धकेलना), अगर /राइट राइट्स के कारण रिपॉजिटरी रूट होना है ।
कारीम

क्या आप का मतलब / आदि लिखने की अनुमति है? या भंडार के लिए प्रतिबद्ध करने में सक्षम होने के लिए? मुझे डर है कि मुझे समझ नहीं आ रहा है कि समस्या कहाँ से आती है।
अप्रेंटिस ५

@ अप्रेंटिस 5 On a new machine, clone the git repo and check out the branch for that machine type:। क्या मैं अन्य शाखाओं को दुर्गम (सुरक्षा कारणों से) बना सकता हूं?
यूजीन यर्मश

आप मशीनों को गिट रिपॉजिटरी की सामग्री को निर्यात करने के लिए कुछ इस तरह का उपयोग कर सकते हैं । फिर प्रत्येक मशीन में उस पर रिपॉजिटरी नहीं होती, बस उसकी शाखा में फाइलें होती हैं। यदि आप प्रत्येक मशीन से केंद्रीय रिमोट में परिवर्तन करने वालों को धक्का देना चाहते हैं, हालांकि, मुझे कोई समाधान नहीं है जिसमें एक ही रिपॉजिटरी दोनों है और आपको विभिन्न शाखाओं पर पहुंच नियंत्रण स्थापित करने की अनुमति भी देता है। शायद आप http के साथ तोड़फोड़ कर सकते हैं। रेपो पर .htaccess के साथ? मुझे नहीं पता कि क्या काम करता है।
अप्रेंटिस 5

@ अप्रेंटिस 5: ऐसा लगता है कि तोड़फोड़ वास्तव में कार्य के लिए सही उपकरण है। आपकी सहायता के लिए धन्यवाद।
यूजीन यर्मश

1

यहाँ एक नब की बिट, लेकिन यह लगता है जैसे एक पद प्राप्त हुक काम कर सकता है

रेपो मास्टर को / var / मास्टर में संग्रहीत किया जाता है
और हुक क्लोन को / var / localclone में रखता है
फिर होस्ट विशिष्ट विवरण की प्रतिलिपि बनाता है।
आपको प्रत्येक सर्वर पर स्थानीय रूप से .git / पोस्ट-हुक प्राप्त करने की आवश्यकता होगी (उपयुक्त सेटिंग्स के साथ)।

यह भी लगता है कि आप कठपुतली या रसोइये की तरह कुछ और चाहते हैं इसके लिए यह आपको विन्यास और मॉड्यूल को केंद्र में रखने के लिए गिट चलाने की अनुमति देगा और कठपुतली महाराज आपके लिए तैनाती और सत्यापन का प्रबंधन करेगा।


1

यहाँ एक त्वरित काम है जिसके बारे में मैंने सोचा था कि
1 में एक केंद्रीय भंडार है /var/repo
। 2. उन फ़ाइलों को रखें जो उस निर्देशिका के सभी डोमेन के लिए वैश्विक हैं।
3. हर उप डोमेन के लिए शाखाओं बनाएं /var/repo/subdomain1, /var/repo/subdomain2आदि
4. एक पोस्ट हुक जहां शाखा के लिए किसी भी धक्का गुरु के साथ विलय कर दिया है बनाएँ।

इसलिए जब आप /var/repo/subdomain2इसका कॉन्फिगरेशन बदलते हैं तो इसे तुरंत मास्टर के साथ मिला दिया जाता है ताकि आप रेपो को पूरी तरह से खींच सकें और सभी कॉन्फिग फाइल्स हों।
जब आप अलग-अलग सबडोमेन कॉन्फिगर्स को खींचना चाहते हैं, तो बस उपयुक्त ब्रांच को खींचें।

आप अपनी कॉन्फिग फाइलों को किस /var/repo/*तरह से पूरी तरह से अलग रखते हैं (क्रोन टैब, मैं सोच सकता हूं)

~ $

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.