VagrantとChefを使用した開発環境










この記事では、PHP開発者向けの開発環境の自動構成の例により、素晴らしいVagrantおよびChefユーティリティーを紹介します(実際、PHPは単なる例であり、以下で説明するものはすべてテクノロジースタックに使用できます)。



どうする?





Ubuntu 12.04で仮想マシン(VM)を構成して、PHPのプロジェクトで動作するようにします。







これはかなり退屈な作業です。特に定期的に実行する場合は、コンピューターが独自に実行するようにします。



これはどのように役立ちますか?









これはすべて現実です。 問題は「どのように?」です。







放浪者





Vagrantは、仮想マシンを作成し、指定どおりに自動的に構成できるユーティリティです。 VagrantはそのままでVirtualBoxと連携しますが、他のソリューションサポートされています。



今後、コンピューターに環境を展開するために必要なのは、1つのコマンドを実行することだけです。



vagrant up
      
      







すべてが自動的に行われます。 タスクに取り掛かりましょう。



Vagrantを構成するには、 Vagrantfileという 1つのファイルのみを使用します。 その中に、仮想マシンの起動時に実行する必要があるすべてのことが記述されています。 Vagrantプロジェクトを初期化するには、コマンドを実行する必要があります



 vagrant init
      
      







プロジェクトのルートで。



ディレクトリ構造は次のようになります。

 recipes www Vagrantfile
      
      







Vagrantの主要な概念の1つはボックスです。 Boxは、仮想マシンのイメージとVagrant自体の設定ファイルを含むアーカイブです。



Vagrant Webサイトのボックスを使用します(各ボックスには少なくともChefとPuppetがインストールされています-これは後で非常に役立ちます)。



最終的なVagrantfileファイルは次のようになります(標準のコメントは削除されています。ドキュメントを参照してください)。



Vagrantfile
 # -*- mode: ruby -*- # vi: set ft=ruby : Vagrant::Config.run do |config| #  box'a config.vm.box = "precise64" # ,     box config.vm.box_url = "http://files.vagrantup.com/precise64.box" #   IP       config.vm.network :hostonly, "11.11.11.11" #   ,         ,   config.vm.share_folder "www", "/var/www", "www", :create => true #  Chef config.vm.provision :chef_solo do |chef| chef.cookbooks_path = "recipes/cookbooks" chef.roles_path = "recipes/roles" chef.add_role "web" # chef.data_bags_path = "../my-recipes/data_bags" chef.json = { "mysql" => { "server_root_password" => "%your_pass0%", "server_repl_password" => "%your_pass1%", "server_debian_password" => "%your_pass2%" } } end end
      
      









設定ファイルを記述するためにRubyによって使用されます。

Vagrantのすべての詳細と雑学を説明することは意味がありません;ドキュメントでそれらを読むことができます(そして必要でさえあります)。 ところで、彼女はよく書かれています。



ファイルでは、ボックスの名前を示します。 まだダウンロードされていない場合、Vagrantはこれを自動的に行い、ハードドライブに保存します。 このため、ボックスのある場所にURLが示されています。 ファイルシステムでパスを指定することができます。



ネットワークプロパティでは、VMがIP 11.11.11.11で利用できることを示しています。 これは、複数のプロジェクトを作成して使用し、それらの名前を決定し、ホストに実際のコンピューターのファイルを入力できるようにするために行われます。



ここでポートを使用することもできます:この例では



 ... config.vm.forward_port 80, 8080 ...
      
      







ホストマシンからポート8080でゲストマシンのポート80に到達するようにVMを構成します。 (Vagrantのドキュメントでは、ホストマシンはコンピューターであり、ゲストマシンは仮想マシンです)。 詳細はこちら



share_folderプロパティを使用すると、ホストマシンとゲストマシンの共有フォルダーを構成できます。 とても便利です。 IDEを開き、VM上ではなくコンピューター上にあるファイルを操作します(ただし、削除されたファイルを操作するようにエディターを構成できます)。それらは即座に同期されます。 デフォルトでは、プロジェクトのフォルダーはVMで/vagrant



沿って利用可能になります。 この例では、ゲストマシンのパス/var/www



に沿って、ホストマシンでwww



フォルダーを使用できるようにします。



次にChef設定について説明します。これについては、以下で説明します。 Chefを使用すると、必要なすべてのソフトウェアがインストールされます。

ここでは選択肢があり 、使用できます:



  1. シェフ
  2. 人形
  3. bashスクリプト




シェフ





Chef-構成管理、プロジェクトの展開などのためのユーティリティ。 Vagrantと組み合わせて、Chefを使用してすべてのソフトウェアをインストールし、VirtualHostと新しいプロジェクトのフォルダーを作成します。 クラスタでのChefの使用に関する興味深い記事へのリンクは、記事の最後に記載されています。



これは疑問を提起するかもしれません-非常に多くのものを自動的にインストールするのはどうして同じですか? 大規模なシェフコミュニティとそのクリエイターによる公式の料理本が助けになります。



クックブックは、Chef用のレシピ、テンプレート、属性、およびその他の設定ファイルのコレクションです。 たとえば、ApacheをOSにインストールするときに使用するApache2クックブックがあります。

レシピ、テンプレート、属性が何であるかは明確ではありませんか? 恐れてはいけません、光を放ち、あなたが非常に迅速にシェフに対処するのに役立つ素晴らしい記事があります。 記事の後半で、独自のクックブックを作成し、すべてがさらに透明になります。



必要なすべてのソフトウェアをインストールするには、次の既存のクックブックを使用します。



  1. Apache2
  2. MySQL
  3. Php
  4. Vim
  5. 作曲家
  6. その他(一部のクックブックは他のクックブックに依存しているため、追加でインストールする必要があります)




レシピフォルダーがディレクトリ構造に存在するのはChefのためです。



ソフトウェアのインストールプロセス




便宜上、ホストマシンにChefをインストールして、 knifeを使用して新しいクックブックの基本フォルダー構造を生成できます。 このステップは完全にオプションです。



ルートとして次のコマンドを実行します。



 curl -L https://www.opscode.com/chef/install.sh | bash
      
      







プロジェクトのルートで、ナイフの構成を作成します。



 mkdir .chef echo "cookbook_path [ '/path-to/recipes/cookbooks' ]" > .chef/knife.rb
      
      







独自のクックブックを作成します。 すべてのソフトウェアが既にインストールされている場合、標準の後に実行され、指定されたドメイン名とプロジェクトへの指定されたパスでVirtualHostを作成し、指定された名前でデータベースを作成します。 それをアプリと呼びます。



 knife cookbook create app
      
      







クックブックは標準のデータベースに依存し、当然Apache2にも依存するため、依存関係を追加します。



/path-to/recipes/cookbooks/app/metadata.rb
 name 'app' maintainer 'YOUR_COMPANY_NAME' maintainer_email 'YOUR_EMAIL' license 'All rights reserved' description 'Installs/Configures app' long_description IO.read(File.join(File.dirname(__FILE__), 'README.md')) version '0.1.0' depends "apache2" depends "database"
      
      









としてクックブックデータベースをインストールします 。 Chefをローカルにインストールしたため、knifeの機能を使用できます。 それ以外の場合は、 githubからダウンロードして、 / path-to / recipes / cookbooksフォルダーにコピーするだけです:



 cd recipes/cookbooks/ knife cookbook site download database tar zxf database-*.tar.gz rm *.tar.gz
      
      







必要な他のクックブックもインストールされます。



Apache用のVirtualHostの作成




テンプレートを作成します。



/path-to/recipes/cookbooks/app/templates/default/vhost.erb
 <VirtualHost *:80> ServerAdmin <%= @params[:server_email] %> ServerName <%= @params[:server_name] %> DocumentRoot <%= @params[:docroot] %> <Directory <%= @params[:docroot] %>> Options Indexes FollowSymLinks MultiViews AllowOverride ALL Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/<%= @params[:server_name] %>.log LogLevel debug </VirtualHost>
      
      









お気づきのように、テンプレートで変数を使用できます(属性を介して設定)。 それらのデフォルト値を別のファイルに保存します。



/path-to/recipes/cookbooks/app/attributes/default.rb
 default["app"]["database"] = "app" default["app"]["path"] = "/var/www/vm-app" default["app"]["server_name"] = "vm-app" default["app"]["server_email"] = "vm.app@example.com"
      
      









そして、Vagrantfileを使用してすべての変数をオーバーライドします。



Vagrantfile
 ... chef.json = { "app" => { "path" => "/var/www/cool-another-app", "server_name" => "cool-another-app", "server_email" => "cool@another-app.com", "database" => "cool_another_app_db" }, "mysql" => { "server_root_password" => "%your_path0%", "server_repl_password" => "%your_path1%", "server_debian_password" => "%your_path2%" } } ...
      
      







すばらしいです。目的のフォルダを作成し、特定の仮想ホストファイルを作成するのはChefのままです。 これはすべて、リソースと呼ばれるヘルパー関数を介して実行できます。 レシピに直接書き込むこれらのアクション:



/path-to/recipes/cookbooks/app/recipes/default.rb
 # # Cookbook Name:: app # Recipe:: default # # Copyright 2013, YOUR_COMPANY_NAME # # All rights reserved - Do Not Redistribute # include_recipe "mysql::ruby" #     directory node["app"]["path"] do owner "root" group "root" mode "0755" action :create recursive true end #    VirtualHost,    () web_app 'app' do template 'vhost.erb' docroot node['app']['path'] server_name node['app']['server_name'] server_email node['app']['server_email'] end
      
      







同時に、Chefはすべてを自動的に行います。 私たちの場合:サイトを/ etc / apache2 / sites-availableに追加し、 a2ensite server_nameを実行します



利用可能なすべてのリソースのリストは、 ドキュメントに記載されています



DB作成




これを行うには、次のコードを/path-to/recipes/cookbooks/app/recipes/default.rbファイルに追加するだけです。



 mysql_database node['app']['database'] do connection ({:host => 'localhost', :username => 'root', :password => node['mysql']['server_root_password']}) action :create end
      
      







Chefによって実行されるすべてのクックブックのリストは、このファイルのrun_list配列で構成されます。



/path-to/recipes/roles/web.json
 { "name": "web", "default_attributes": { }, "override_attributes": { }, "json_class": "Chef::Role", "description": "web server role", "chef_type": "role", "run_list": ["recipe[apt]", "recipe[chef-dotdeb]", "recipe[chef-dotdeb::php54]", "recipe[apache2]", "recipe[apache2::mod_php5]", "recipe[apache2::mod_rewrite]", "recipe[php]", "recipe[mysql]", "recipe[mysql::server]", "recipe[app]", "recipe[composer]", "recipe[sqlite]", "recipe[vim]", "recipe[cron]", "recipe[ntp]"] }
      
      







以上です! 私たちの環境は検証の準備ができています。 プロジェクトのルートで実行します。



 vagrant up
      
      







このコマンドの後、Vagrantは指定されたボックスを初期化し、必要なすべてのソフトウェアのインストールを開始します。



最後に何がありますか?





その結果、完全に構成された仮想マシンができました。 SSH経由でアクセスします。 これを行うには、単に実行します



 vagrant ssh
      
      







テストサイトのIPアドレスと名前をホストに追加した後、ホストマシンのブラウザーでそれを開くだけで、VMでコードが実行されます。

重要なポイントは、VMの状態を維持することです。 これが行われない場合、 vagrant up



を介して起動するたびに、ソフトウェアが再インストールされます。 同時に、私たちのアイデアのすべてのポイントが失われます。 この状況を解決するために、Vagrantには次のコマンドがあります。



  1. vagrant suspend-現在の状態を保存し、 vagrant up



    コマンド操作が保存されたポイントから続行した後
  2. vagrant halt -VMをオフにします




これらのコマンドを実行した後、OSを安全に再起動して、作業を再開できます。



VMに関連付けられているすべてのリソースを破棄するには、 vagrant destroyコマンドを使用します。

一部の記事では、データ損失のリスクを回避するために、ホストマシンにデータベースを保持することを推奨しています。



Vagrantを使用して、テストクラスターを上げることもできますが、仮想マシン同士の通信は、 ネットワーク構成プロパティを介して構成されます。



便利な読書リンク





興味のある方は、次のリソースに慣れることをお勧めします。



この記事で構成されたVagrant + Chef環境ファイル。



放浪者:



  1. docs.vagrantup.com/v2-ドキュメント。 必要な読書。
  2. www.vagrantbox.es-すべての一般的なOSのボックスのリスト
  3. habrahabr.ru/post/140714
  4. net.tutsplus.com/tutorials/setting-up-a-staging-environmentは、ステージング環境のセットアップに関する非常に優れた記事です。 必要な読書。
  5. www.phptherightway.com - PHP開発者




シェフ:



  1. docs.opscode.com-公式サイト
  2. docs.opscode.com/resource_deploy.html-デプロイメント
  3. gettingstartedwithchef.com-読む必要があります。 シェフのすべての基本的なことを明らかにします
  4. habrahabr.ru/company/scalaxy/blog/87302









最後まで読んでくれたみんなに感謝します。 例えば、Vagrantについて初めて聞いたたちに起こるように、この記事があなたにとって有益でポジティブな感情を呼び起こしたことを願っています。

私は、何らかの形での不正確さ、そしておそらく技術的な非識字について事前に謝罪します。



All Articles