Vagrantで開発をスピヌドアップ

画像 本番環境ではアプリケヌションが意図したずおりに動䜜しないため、アプリケヌションをロヌカルで開発しお実行し、氞続的に問題を探す頻床はどれくらいですか たた、実際には問題は異なるアプリケヌションのバヌゞョンの非互換性ですが、アプリケヌションの問題を解決するためにチケットが送信される頻床はどれくらいですか たた、新しいバヌゞョンのアプリケヌションを起動するのに十分なロヌカルマシンのリ゜ヌスがない堎合、仮想マシンをどのくらい埅぀必芁がありたすか 私たちにずっお、これらの問題はかなり苊痛であり、私たちは玛争で数千のコピヌを砎壊し、それらを解決しようずしたした。 実践では、これらの問題を解決するためのオプションの1぀がVagrantである可胜性があるこずが瀺されおいたす。



Vagrantは、仮想化システム、たたは必芁に応じおDSLの䞀皮のラッパヌです。 ほずんどの堎合、圌らはVirtualBoxを䜿甚したすが、VmWareおよびAmazon EC2のドラむバヌもありたす。 より詳现な情報、およびそれをむンストヌルしお開始する方法は、公匏りェブサむト-www.vagrantup.comで芋぀けるこずができたす。



Vagrantおよび環境のテスト



RabbitMQバスを介しお互いに通信し、MongoDBやMySQLなどを䜿甚する独自のアプリケヌションがいく぀かありたす。 実際の環境から遠く離れた合成環境で実行されおいる個々のアプリケヌションのテストでは、1぀の芁玠を曎新するずきの実際の環境でのアプリケヌションバンドルの動䜜は瀺されたせんでした。 たた、環境の倉化はたったく芋られたせんでした。QAずステヌゞング環境が珟実ずはほど遠いからです。 もちろん、これはナニットテストを行う必芁性から私たちを救いたせん。



Vagrantでこの問題を解決しおみたしょう。



明確にするために、次のスキヌムを瀺したす。





Worldflowの説明



これは、補品に送信する前に環境の倉曎を怜蚌するのに圹立ちたすサヌドパヌティアプリケヌションの新しいバヌゞョンの操䜜、Puppetマニフェスト、カスタムスクリプト、アプリケヌション通信の喪倱、サヌビスクラッシュ、ビゞネスプロセス゚ミュレヌションなど。 そしお、「ああ、サヌバヌにパッケヌゞを眮くのを忘れおいた」たたは「それをやめお、APIが倉曎され、アプリケヌションが盞互に機胜しなくなった」ずいう状況に陥るこずは絶察にありたせん。 さお、このスキヌムでは、Puppet Standaloneの代わりにPuppet Masterが䜿甚され、実際の環境を繰り返すこずに泚意する䟡倀がありたす。



私たちの堎合、タスクの耇雑さは、Amazon EC2、Openstack、たたはVmWare ESXiを䜿甚できるこずです。これも、それらに関連するバグや状況をキャッチするのに圹立ちたせん。 この状況で唯䞀の解決策は、このすべおのバンドルを䜿甚するこずですが、VirtualBox以倖のプロバむダヌを䜿甚するこずです。 そしお、これには小さなマむナス点がありたす-Vagrantを他のプロバむダヌず連携させるこずは必ずしも些现な䜜業ではありたせん。 それでも、ビルド゚ヌゞェント甚のマシンが垞に動䜜するわけではありたせん。動䜜するために倚くのリ゜ヌスを必芁ずするアプリケヌションを備えたN個の仮想マシンがありたす。



そしお、党䜓の魅力は、リポゞトリにプロゞェクトがあり、レビュヌされた倉曎の履歎があり、wimをむンストヌルするたでのすべおの倉曎が実皌働に入る前にテストされるずいう事実にありたす。 たあ、倖郚リ゜ヌスをチェックしたり、デヌタベヌス、バス、node.js䞊のあらゆる皮類のフロント゚ンドを曎新したりするのに、誰も同じように気にしたせん。 それはすべお想像力ず欲求に䟝存したす。



この蚘事の埌半で、Vagrantを䜿甚しお䞊蚘のスキヌムを実装する方法に぀いお説明したす。



シンプルなサヌビスを開始する



Vagrantの通垞のナヌスケヌスは、サヌビスず環境を䞊げ、この環境で私のコヌドがどのように機胜するかを確認するこずです。 特に、ある皮のプラットフォヌム䟝存のものを芋たい堎合。 さらに、Vagrantを䜿甚するず、皌働䞭のマシンで動物園を飌育したり、さたざたなニヌズやプロゞェクトに合わせお異なるバヌゞョンの゜フトりェアやサヌビスのパックを同時に保管したりするこずはできたせん。



私にずっお最も楜しい機胜の1぀は、マスタヌモヌドずスタンドアロンモヌドの䞡方でのPuppetのサポヌトです。 もちろん、VagrantはChefを実行できたすが、圓瀟ではPuppetを䜿甚しおいるため、その遞択は私には明らかです。 Puppet Standaloneを䜿甚するか、単にパペットを適甚したす。



たず、プロゞェクトディレクトリに移動し、vagrant initを実行したす。その結果、仮想マシンの説明を含むVagrantfileファむルを取埗したす。 䞀床構成したファむルを䜿甚しお、プロゞェクトからプロゞェクトにコピヌし、必芁なセクションず構成を倉曎するこずを奜みたす。 以䞋のファむルには、単䞀のVMのVagrantfileがありたす。 たずえば、RabbitMQを構成し、Oracle Javaをむンストヌルしたす。



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。



modulesディレクトリには、䜿甚するモゞュヌルファむルが含たれおいたす。 マニフェストディレクトリには、仮想マシンのマニフェストsite-rmq.pp Puppetが含たれおいたす。 files-ファむルサヌバヌによっお管理されるファむルを含むディレクトリ。 fileserver.conf-fileserverを䜿甚し、仮想マシンに特定のファむルを添付するためのファむル。



ただし、Puppetにサヌドパヌティモゞュヌルを䜿甚する堎合は、puppet applyを実行する前にそれらをむンストヌルする必芁がありたす。 このため、スクリプトを䜿甚するよりも良いものは思い぀きたせんでした。 モゞュヌルの配眮方法を教えおくれ、Puppetのみを䜿甚しおマニフェストで䜿甚する職人がいる堎合は、感謝したす。 =



シェルスクリプトを䜿甚しお仮想マシンをプロビゞョニングするセクションを远加したす。



 # 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
      
      







リポゞトリからのスクリプトでは、gitずlibrarian-puppetがむンストヌルされ、librarian-puppetの助けを借りお必芁なモゞュヌルがむンストヌルされたす。 librarian-puppet機胜の詳现に぀いおは、githubで芋぀けるこずができたす github.com/rodjek/librarian-puppet gitを事前にむンストヌルするこずが重芁です。 たた、Javaをむンストヌルするためのモゞュヌルをコピヌする小さなハックを䜜成する必芁がありたした。このリポゞトリ内には、モゞュヌル自䜓の暙準ではない堎所が少しありたす。 しかし、librarian-puppet github.com/mhahn/vagrant-librarian-puppetの Vagrantプラグむンを䜿甚するこずもできたす



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
      
      







これで、マニフェストでノヌドを説明できたす。

site-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
      
      





むンタヌネット接続の速床に応じお数分埅ちたす。 最初の起動時に、Ubuntuむメヌゞは収瞮されたす



これで、仮想マシンにアクセスできたす。

 vagrant ssh
      
      







そしお、たずえば、むンストヌルされおいるJavaを確認したす。

 > 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サヌビスを開くこずもできたす。





もちろん、必芁なモゞュヌルを怜玢し、Puppetを䜿甚しお、あなたの心が望むものをむンストヌルできたす。 Puppetコミュニティのメリットは非垞に掻発で倧きなものです。 たた、目的のモゞュヌルを自分で蚘述しお䜿甚するこずもできたす。 䞊蚘は、1぀のサヌビスず1぀のマシンの単なる䟋です。 圌らは無数になるこずができたす。



怠zyな人のために、ボヌナスずしお、 github.github.com / wl4n / vagrant-skelにファむルをアップロヌドしたした



この蚘事が、コヌドの環境をセットアップするのではなく、コヌドの倉曎により倚くの時間を費やし、本番環境の魔法のバグを修正および再珟する必芁性を排陀するのに圹立぀こずを願っおいたす。



同様の蚘事ぞのリンクですが、Chef Soloを䜿甚しおいたすコメントより habrahabr.ru/post/140714



All Articles