2012-01-09 4 views
6

कैसे संभाल सकता हूं मेरे पास PHP, MySQL, आदि में लिखा गया एक ऐप है। ऐप में कुछ निर्भरताएं हैं जैसे कि बीनस्टॉक, सोलर और कुछ PHP एक्सटेंशन।मेरे ऐप के एकाधिक इंस्टॉलेशन - मैं इसे

प्रत्येक ग्राहक के लिए हमारे पास ऐप की एक अलग स्थापना है, या तो अन्य ग्राहकों के साथ साझा सर्वर पर या केवल उस ग्राहक के साथ सर्वर पर।

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

  • की क्षमता को देखने के लिए अनुमति देता है

    1. वेब इंटरफेस:

      क्या हम के लिए देख रहे वास्तव में एक उपकरण निम्न सुविधाओं का के रूप में कई संभव के रूप में किया है नए प्रतिष्ठानों एक विशिष्ट संशोधन या शाखा

    हम नए सर्वर bootstrap के लिए एक उपकरण के लिए नहीं देख रहे हैं करने के लिए मौजूदा प्रतिष्ठानों को अद्यतन करने के

  • की क्षमता - हम अभी भी मैन्युअल रूप से करो। इसके बजाए हम मौजूदा सर्वर पर ग्राहकों के सेटअप को स्वचालित करने का एक तरीका ढूंढ रहे हैं।

    क्या शेफ या कठपुतली इसके लिए पर्याप्त होगी, क्या कोई और उपयुक्त उपकरण है, या आप खुद को कुछ रोल करने की सलाह देंगे?

  • उत्तर

    10

    मैं एक पूर्णकालिक डेवलपर हूं जो कठपुतली लैब पर कठपुतली पर काम कर रहा है। मैं प्रो पपेट के सह-लेखक भी हूं।

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

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

    # <modulepath>/site/manifests/app_dependencies.pp 
    class site::app_dependencies { 
        # Make all package resources in this class default to 
        # being managed as installed on the node 
        Package { ensure => installed } 
        # Now manage the dependencies 
        package { 'php': } 
        package { 'solr': } 
        package { 'beanstalk': } 
        # The beanstalk worker queue service needs to be running 
        service { 'beanstalkd': 
        ensure => running, 
        require => Package['beanstalk'], 
        } 
    } 
    

    अब आप एक कक्षा में अपने निर्भरता है, तो आप बस नोड्स जहां आपके आवेदन तैनात किया जाएगा पर इस वर्ग में शामिल कर सकते हैं। यह आमतौर पर site.pp फ़ाइल में या कठपुतली डैशबोर्ड में होता है यदि आप वेब इंटरफ़ेस का उपयोग कर रहे हैं।

    # $(puppet config print confdir)/manifests/site.pp 
    node www01 { 
        include site::app_dependencies 
    } 
    

    अगला, आपको सिस्टम पर एप्लिकेशन के कई उदाहरण घोषित करने का एक तरीका चाहिए। दुर्भाग्यवश, अभी वेब इंटरफ़ेस से ऐसा करने का कोई आसान तरीका नहीं है लेकिन कठपुतली प्रकट करने और परिभाषित संसाधन प्रकार का उपयोग करना संभव है। यह समाधान अनुप्रयोग के लिए गिट रिपॉजिटरी चेकआउट प्रबंधित करने के लिए vcsrepo संसाधन का उपयोग करता है।

    # <modulepath>/myapp/manifests/instance.pp 
    define myapp::instance($git_rev='master') { 
        # Resource defaults. The owner and group might be the web 
        # service account instead of the root account. 
        File { 
        owner => 0, 
        group => 0, 
        mode => 0644, 
        } 
        # Create a directory for the app. The resource title will be copied 
        # into the $name variable when this resource is declared in Puppet 
        file { "/var/lib/myapp/${name}": 
        ensure => directory 
        } 
        # Check out the GIT repository at a specific version 
        vcsrepo { "/var/lib/myapp/${name}/working_copy": 
        ensure => present, 
        provider => git, 
        source => 'git://github.com/puppetlabs/facter.git', 
        revision => $git_rev, 
        } 
    } 
    

    इस के साथ परिभाषित संसाधन प्रकार, तुम इतनी तरह अपने ऐप्लिकेशन के एकाधिक प्रतिष्ठानों की घोषणा कर सकते हैं:

    # $(puppet config print confdir)/manifests/site.pp 
    node www01 { 
        include site::app_dependencies 
        # Our app instances always need their dependencies to be managed first. 
        Myapp::Instance { require => Class['site::app_dependencies'] } 
    
        # Multiple instances of the application 
        myapp::instance { 'jeff.acme.com': git_rev => 'tags/1.0.0' } 
        myapp::instance { 'josh.acme.com': git_rev => 'tags/1.0.2' } 
        myapp::instance { 'luke.acme.com': git_rev => 'tags/1.1.0' } 
        myapp::instance { 'teyo.acme.com': git_rev => 'master' } 
    } 
    

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

    आशा इस जानकारी में मदद करता है।

    +0

    मैं फ़ैक्टरी पैटर्न इंटरफ़ेस का उपयोग करके कुछ बहुत ही समान करने की कोशिश कर रहा हूं, लेकिन मेरे पास एक हेलुवा समय है जो निर्देशिकाओं से निपटता है जो उदाहरणों में साझा किए जाते हैं, क्या आप मेरा प्रश्न @ http://serverfault.com/questions/ देख सकते हैं 442,520/कठपुतली संभव के लिए उपयोग-सॉफ्टवेयर डिजाइन पैटर्न में मॉड्यूल –

    संबंधित मुद्दे