वैग्रांत के साथ विकास को गति दें

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



वैग्रंट एक वर्चुअलाइजेशन सिस्टम पर एक प्रकार का आवरण है या, यदि आप पसंद करते हैं, तो डीएसएल। ज्यादातर वे VirtualBox का उपयोग करते हैं, लेकिन VmWare के लिए ड्राइवर हैं और यहां तक ​​कि Amazon EC2 के लिए भी। अधिक विस्तृत जानकारी, साथ ही इसे कैसे स्थापित करें और आरंभ करें, आधिकारिक वेबसाइट - www.vagrantup.com पर पाया जा सकता है



वैग्रांत और पर्यावरण परीक्षण



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



आइए इस समस्या को वैग्रंट के साथ हल करने का प्रयास करते हैं।



स्पष्टता के लिए, मैं निम्नलिखित योजना दिखाऊंगा:





वर्ल्डफ्लो का विवरण:



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



हमारे मामले में, कार्य की एक जटिलता यह है कि Amazon EC2, Openstack या यहां तक ​​कि VmWare ESXi का उपयोग किया जा सकता है, जो फिर से बग और उनसे जुड़ी स्थितियों को पकड़ने में मदद नहीं करेगा। इस स्थिति में एकमात्र तरीका मुझे इस सभी बंडल का उपयोग दिखाई देता है, लेकिन वर्चुअलबॉक्स के अलावा एक प्रदाता के साथ। और इसमें से एक छोटा सा ऋण है - अन्य प्रदाताओं के साथ वैग्रेंट काम करना हमेशा एक तुच्छ काम नहीं है। अच्छी तरह से और अभी भी, एक बिल्ड एजेंट के लिए हमेशा एक मशीन नहीं होती है जो उन अनुप्रयोगों के साथ खुद को एन वर्चुअल मशीन पर खींच लेगी जिन्हें काम करने के लिए बहुत सारे संसाधनों की आवश्यकता होती है।



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



बाद में लेख में हम वर्णन करेंगे कि उपरोक्त योजना को लागू करने के लिए वैग्रंट का उपयोग कैसे करें।



एक साधारण सेवा शुरू करना



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



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



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



Vagrantfile:
# -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # All Vagrant configuration is done here. The most common configuration # options are documented and commented below. For a complete reference, # please see the online documentation at vagrantup.com. # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "precise64" # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. # config.vm.box_url = "http://domain.com/path/to/above.box" config.vm.box_url = "http://files.vagrantup.com/precise64.box" # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network :forwarded_port, guest: 3000, host: 3000 # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network :private_network, ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network :public_network # If true, then any SSH connections made will enable agent forwarding. # Default value: false config.ssh.forward_agent = true ### Define VM for RabbitMQ config.vm.define "rmq", primary: true do |rmq| # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # rmq.vm.provider :virtualbox do |vb| # Don't boot with headless mode vb.gui = false # Use VBoxManage to customize the VM. For example to change memory: vb.customize ["modifyvm", :id, "--memory", "1024"] end # Networking options rmq.vm.network :private_network, ip: "192.168.100.5" rmq.vm.hostname = "rmq.example.com" end end
      
      







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



Vagrantfile में नोड विवरण में एक अनुभाग जोड़ें:



 rmq.vm.provision :puppet do |puppet| puppet.manifests_path = "./vagrant.d/manifests" puppet.manifest_file = "site-rmq.pp" puppet.module_path = "./vagrant.d/modules" puppet.options = "--fileserver=/vagrant/vagrant.d/fileserver.conf --verbose --debug" end
      
      







और, तदनुसार, हमें बनाने की आवश्यकता है ।/vagrant.d/modules ,/vagrant.d/manifests ,/vagrant.d/files और ./vagrant.d/manifests/site-rmq.pp ./vagrant.d/fileserver.conf।



मॉड्यूल निर्देशिका में वे मॉड्यूल फाइलें हैं जिनका हम उपयोग करेंगे; मैनिफ़ेस्ट्स निर्देशिका में हमारी वर्चुअल मशीन की मेनिफ़ेस्ट साइट-rmq.pp कठपुतली शामिल है; फाइलें - फाइलरवर द्वारा प्रबंधित फाइलों के साथ एक निर्देशिका; fileserver.conf - फाइलरवर का उपयोग करने के लिए एक फाइल और हमारी वर्चुअल मशीन में किसी भी विशिष्ट फाइल को संलग्न करना।



लेकिन अगर हम कठपुतली के लिए तीसरे पक्ष के मॉड्यूल का उपयोग करना चाहते हैं, तो हमें कठपुतली आवेदन चलाने से पहले उन्हें स्थापित करने की आवश्यकता है। इसके लिए, मुझे स्क्रिप्ट का उपयोग करने से बेहतर कुछ नहीं आया; अगर शिल्पकार हैं जो मुझे बताएंगे कि मॉड्यूल कैसे लगाए जाएं, और फिर उन्हें केवल कठपुतली का उपयोग करके मैनिफ़ेस्ट में उपयोग करें, तो मैं आभारी रहूंगा। =)



वर्चुअल मशीन को शेल स्क्रिप्ट के साथ जोड़ने के लिए एक अनुभाग जोड़ें:



 # Enable shell provisioning config.vm.provision "shell", path: "./vagrant.d/pre-puppet.sh"
      
      







और ./vagrant.d निर्देशिका में स्क्रिप्ट बनाएँ:

pre-puppet.sh:
 #!/bin/bash # This script installs modules for puppet standalone echo "[Info] Running pre-puppet.sh for install modules" if [ "x$(dpkg -l | grep -E '^ii\s+git\s')" == "x" ] then echo "[Info] Installing git" apt-get -y install git || (echo "[Error] Cant install git" && exit 0) else echo "[Info] git already is installed, skipping" fi if [ "x$(gem list librarian-puppet|grep -v LOCAL)" == "x" ] then echo "[Info] Installing librarian-puppet" gem install librarian-puppet || (echo "[Error] Cant install librarian-puppet" && exit 0) else echo "[Info] librarian-puppet already is installed, skipping" fi if [ ! -e Puppetfile ] then cat > Puppetfile << EOF #!/usr/bin/env ruby #^syntax detection # Warning! # Do not edit this file, check pre-puppet.sh script! # forge "http://forge.puppetlabs.com" # use dependencies defined in Modulefile #modulefile mod 'puppetlabs/rabbitmq' mod 'saz/timezone' mod 'saz/locales' mod 'jpuppet/java-git', :git => "git://github.com/jpuppet/java.git" mod 'jfryman/nginx' EOF fi mkdir -p /vagrant/vagrant.d/modules echo "[Info] Installing puppet modules" librarian-puppet install --path=/vagrant/vagrant.d/modules/ || (echo "[Error] Cant install modules" && exit) rm Puppetfile* # Ugly hack for java cp -r /vagrant/vagrant.d/modules/java-git/modules/java /vagrant/vagrant.d/modules exit 0
      
      







रिपॉजिटरी से स्क्रिप्ट में, गिट और लाइब्रेरियन-कठपुतली स्थापित की जाती है और फिर लाइब्रेरियन-कठपुतली की मदद से हमारे द्वारा आवश्यक मॉड्यूल स्थापित किए जाते हैं। लाइब्रेरियन-कठपुतली सुविधाओं के बारे में अधिक जानकारी जीथब पर पाई जा सकती है: github.com/rodjek/librarian-puppet अग्रिम में गिट स्थापित करना महत्वपूर्ण है, अन्यथा हम गिट रिपोजिटरी से मॉड्यूल स्थापित करने के लिए लाइब्रेरियन-कठपुतली का उपयोग नहीं कर पाएंगे। और मुझे जावा को स्थापित करने के लिए मॉड्यूल की प्रतिलिपि बनाने के साथ एक छोटा हैक भी करना था, बस इस रिपॉजिटरी में मॉड्यूल के एक छोटे से गैर-मानक स्थान पर। लेकिन आप लाइब्रेरियन- पपेट github.com/mhahn/vagrant-librarian-puppet के लिए वैग्रंट प्लगइन का भी उपयोग कर सकते हैं



Vagrantfile का अंतिम दृश्य:
 # -*- mode: ruby -*- # vi: set ft=ruby : # Vagrantfile API/syntax version. Don't touch unless you know what you're doing! VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| # All Vagrant configuration is done here. The most common configuration # options are documented and commented below. For a complete reference, # please see the online documentation at vagrantup.com. # Every Vagrant virtual environment requires a box to build off of. config.vm.box = "precise64" # The url from where the 'config.vm.box' box will be fetched if it # doesn't already exist on the user's system. # config.vm.box_url = "http://domain.com/path/to/above.box" config.vm.box_url = "http://files.vagrantup.com/precise64.box" # Create a forwarded port mapping which allows access to a specific port # within the machine from a port on the host machine. In the example below, # accessing "localhost:8080" will access port 80 on the guest machine. # config.vm.network :forwarded_port, guest: 3000, host: 3000 # Create a private network, which allows host-only access to the machine # using a specific IP. # config.vm.network :private_network, ip: "192.168.33.10" # Create a public network, which generally matched to bridged network. # Bridged networks make the machine appear as another physical device on # your network. # config.vm.network :public_network # If true, then any SSH connections made will enable agent forwarding. # Default value: false config.ssh.forward_agent = true # Enable shell provisioning config.vm.provision "shell", path: "./vagrant.d/pre-puppet.sh" ### Define VM for RabbitMQ config.vm.define "rmq", primary: true do |rmq| # Provider-specific configuration so you can fine-tune various # backing providers for Vagrant. These expose provider-specific options. # Example for VirtualBox: # rmq.vm.provider :virtualbox do |vb| # Don't boot with headless mode vb.gui = false # Use VBoxManage to customize the VM. For example to change memory: vb.customize ["modifyvm", :id, "--memory", "1024"] end # Networking options rmq.vm.network :private_network, ip: "192.168.100.5" rmq.vm.hostname = "rmq.example.com" # Enable provisioning with Puppet stand alone. Puppet manifests # are contained in a directory path relative to this Vagrantfile. # You will need to create the manifests directory and a manifest in # the file base.pp in the manifests_path directory. # rmq.vm.provision :puppet do |puppet| puppet.manifests_path = "./vagrant.d/manifests" puppet.manifest_file = "site-rmq.pp" puppet.module_path = "./vagrant.d/modules" puppet.options = "--fileserver=/vagrant/vagrant.d/fileserver.conf --verbose --debug" end end end
      
      







अब हम अपने नोड का वर्णन प्रकट कर सकते हैं:

साइट-rmq.pp:
 # # This manifest describes development environment # RabbitMQ-server # class { 'timezone': timezone => 'Europe/Moscow', } class { 'locales': locales => ['ru_RU.UTF-8 UTF-8'], } # apt-get update # --------------------------------------- class apt_install { exec {'update': command => 'apt-get update', path => '/usr/bin', timeout => 0, } -> package {[ 'vim', ]: ensure => installed, } } # RabbitMQ service class rabbitmq_install { class { '::rabbitmq': service_manage => false, port => '5672', delete_guest_user => true, } rabbitmq_user { 'developer': admin => true, password => 'Password', } rabbitmq_vhost { 'habr': ensure => present, } rabbitmq_user_permissions { 'developer@habr': configure_permission => '.*', read_permission => '.*', write_permission => '.*', } rabbitmq_plugin {'rabbitmq_management': ensure => present, } } class java_install { class { "java": version => "1.7", jdk => true, jre => true, sources => false, javadoc => false, set_as_default => true, export_path => false, vendor => "oracle", } } # Include classes include apt_install include timezone include locales include rabbitmq_install include java_install
      
      







अब यह हमारी परियोजना की सूची में करने के लिए पर्याप्त है:

 vagrant up
      
      





और अपने इंटरनेट कनेक्शन की गति के आधार पर कुछ मिनट प्रतीक्षा करें। (पहली शुरुआत में, उबंटू छवि को अपवित्र किया जाता है)



अब आप हमारे वर्चुअल मशीन पर जा सकते हैं:

 vagrant ssh
      
      







और जाँच, उदाहरण के लिए, स्थापित जावा:

 > vagrant ssh Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64) * Documentation: https://help.ubuntu.com/ Welcome to your Vagrant-built virtual machine. Last login: Sat May 17 12:28:08 2014 from 10.0.2.2 vagrant@rmq:~$ java -version java version "1.7.0_55" Java(TM) SE Runtime Environment (build 1.7.0_55-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.55-b03, mixed mode)
      
      







और आप WebUI RabbitMQ सेवा भी खोल सकते हैं:





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



आलसी लोगों के लिए, एक बोनस के रूप में, मैंने फ़ाइल को github पर अपलोड किया: github.com/wl4n/vagrant-skel



मुझे उम्मीद है कि यह लेख आपको कोड को बदलने के लिए अधिक समय समर्पित करने में मदद करेगा, बजाय इसके लिए पर्यावरण स्थापित करने के, और उत्पादन पर्यावरण के जादुई कीड़े को ठीक करने और पुन: उत्पन्न करने की आवश्यकता को समाप्त करेगा।



इसी तरह के लेख के लिए लिंक, लेकिन शेफ सोलो (टिप्पणियों से) का उपयोग कर: habrahabr.ru/post/140714



All Articles