ラベル Vagrant の投稿を表示しています。 すべての投稿を表示
ラベル Vagrant の投稿を表示しています。 すべての投稿を表示

2014年11月30日日曜日

【Berkshelf】The resource at 'hoge' does not appear to be a valid cookbook. Does it have a metadata.rb?

まだまだエラーは続くよー。
この本の通り書いててこの本の通り書いててvendoring cookbookしたらエラーした。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

デプロイツール?のCapistrano3っていうのを開発用仮想マシンに入れるところ。
下記コマンドでcookbookのひな形を作って
bundle exec knife cookbook create capistrano -o site-cookbooks
できたフォルダのrecipes/default.rbを変更、
Vagrantfileのrun_listに追記して、
Berksfileを修正。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
cookbook "capistrano", path: "./site_cookbooks/capistrano"
で、cookbooksをvendoringしたらエラーした。

naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?

metadata.rb?

metadata.rbはどう見てもあるんだよなぁ。
naichilabmba:vagrant_book hu$ ls site-cookbooks/capistrano/
CHANGELOG.md README.md attributes definitions files  libraries metadata.rb providers recipes  resources templates
なぜだ…
phpenvの方のvendoringは問題なく成功してるし…。うーむ。

phpenvの方

capistranoの方

phpenvの方は1行追加してあるけど他は全く一緒だよなぁ。
そもそも「knife cookbook create」で作ったテンプレートのままだし。

ためしにphpenvの方のmetadata.rbをリネームしてberks vendorしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
/Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/ridley-4.1.0/lib/ridley/chef/cookbook.rb:40:in `from_path': no metadata.json or metadata.rb found at /Users/hu/Documents/vagrant_book/site-cookbooks/phpenv (IOError)
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/locations/path.rb:21:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/dependency.rb:126:in `cached_cookbook'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:387:in `block in reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `each'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/lockfile.rb:372:in `reduce!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/installer.rb:32:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:371:in `install'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/berksfile.rb:590:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:387:in `vendor'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:52:in `dispatch'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/lib/berkshelf/cli.rb:27:in `execute!'
 from /Users/hu/.rbenv/versions/1.9.3-p547/lib/ruby/gems/1.9.1/gems/berkshelf-3.1.5/bin/berks:5:in `<top (required)>'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `load'
 from /Users/hu/.rbenv/versions/1.9.3-p547/bin/berks:23:in `<main>'
naichilabmba:vagrant_book hu$ 
IOエラーに変わっただと…?
一旦phpenvの方のmetadata.rbを戻してcapistrano側のmetadata.rbをリネームしてみた。
naichilabmba:vagrant_book hu$ bundle exec berks vendor cookbooks
Resolving cookbook dependencies...
Fetching 'phpenv' from source at site-cookbooks/phpenv
Fetching 'capistrano' from source at site_cookbooks/capistrano
The resource at '/Users/hu/Documents/vagrant_book/site_cookbooks/capistrano' does not appear to be a valid cookbook. Does it have a metadata.rb?
naichilabmba:vagrant_book hu$ 
結果変わらず。 どういう状態だろ。
metadata.rbを読み込みに行く前に無いと判断されてる?
設定ファイルミスったかなぁ。

原因発見

改めてBerksfile眺めてたら見つけた。
ひどいミス。
source "http://api.berkshelf.com"

cookbook "apt"
cookbook "phpenv", path: "./site-cookbooks/phpenv"
cookbook "hostsfile"
#cookbook "capistrano", path: "./site_cookbooks/capistrano"
cookbook "capistrano", path: "./site-cookbooks/capistrano"
まぁそんなもんだよね…。
pathが含まれるエラーはとりあえずそのpathの存在見ないとな…すぐ分かったはずなのに。

2014年11月29日土曜日

【nginx】nginxがうまく起動しなくてログおっかけて修正するだけで数時間かかった。


相変わらず下記の本を読みながらCI環境構築を進めてるんだけどnginxがうまく起動しなかった。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

本では vagrant provision するとChefがnginxの設定や起動までやってくれてすぐにindex.phpに繋がるよ!って書いてあるんだけどどうにもこうにも繋がらない。

vagrant sshで対象の仮想マシンに繋いでnginxの状態を調べてみると…
vagrant@develop:~$ service nginx status
 * nginx is not running
nginx起動してないじゃん…
あと良くわからないのがstartしても何も応答がないんだよね・・・
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx start
vagrant@develop:~$ service nginx status
 * nginx is not running
vagrant@develop:~$ 

ログ確認

じゃあnginxの起動ログ見てみようってことで探した。
参考:http://heartbeats.jp/hbblog/2012/02/nginx03.html
エラーログは「/var/log/nginx/error.log」ってとこにあるらしい。

ログを見ると…ファイルはあるけど現在時刻では何も残ってない…
もしかしてssh接続したユーザーって起動コマンド打てない?って思ってsudoで再実行。
vagrant@develop:~$ sudo service nginx start
vagrant@develop:~$ 
そうしたらログに行が増えてた
2014/11/29 09:20:15 [emerg] 12499#0: invalid number of arguments in "root" directive in /etc/nginx/sites-enabled/test:5

testって設定ファイルがおかしーよ!って言われてるっぽいなぁ。

原因

testってファイルは
VagrantからChef経由でサーバーに作ったファイル。
見てみる。

test
server {
        listen 80;

        root /var/www/application/current/app/webroot
        index index.php index.html index.htm;

        server_name test.localhost;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                try_files $uri =404;
                include /etc/nginx/fastcgi_params;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_intercept_errors on;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param CAKE_ENV test;
        }
}
4行目…セミコロンないよねorz

修正

ホストマシンのtest.erbを修正し、
「rm -rf cookbooks」でcookbooksフォルダを一旦削除、
「bundle exec berks vendor ./cookbooks」でBerkshelfを使ってcookbookを再作成
「vagrant provision」で仮想マシンへ再度反映

結果

動いたーーーーーーーー
こんな凡ミスで数時間持ってかれた…。
まぁコマンド試行錯誤しててちょっとUNIXに慣れた気がするしいいか。

2014年11月26日水曜日

【Vagrant、Chef-Solo】The cookbook path 'hogehoge/.cookbooks' doesn't exist. Ignoring...


この本の通り書いててvagrantからchef-soloを呼び出したんだけどエラーした。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩

エラー

naichimba:vagrant_book hu$ vagrant provision develop
==> develop: The cookbook path '/Users/hu/Documents/vagrant_book/.cookbooks' doesn't exist. Ignoring...

エラー全文

naichimba:vagrant_book hu$ vagrant provision develop
==> develop: The cookbook path '/Users/hu/Documents/vagrant_book/.cookbooks' doesn't exist. Ignoring...
==> develop: Chef 11.16.4 Omnibus package is already installed.
==> develop: Configuring cache buckets...
==> develop: Running provisioner: chef_solo...
Generating chef JSON and uploading...
==> develop: Running chef-solo...
==> develop: stdin: is not a tty
==> develop: [2014-11-25T16:30:57+00:00] INFO: Forking chef instance to converge...
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Fork successful. Waiting for new chef pid: 2306
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Forked instance now converging
==> develop: [2014-11-25T16:30:57+00:00] WARN: 
==> develop: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
==> develop: SSL validation of HTTPS requests is disabled. HTTPS connections are still
==> develop: encrypted, but chef is not able to detect forged replies or man in the middle
==> develop: attacks.
==> develop: 
==> develop: To fix this issue add an entry like this to your configuration file:
==> develop: 
==> develop: ```
==> develop:   # Verify all HTTPS connections (recommended)
==> develop:   ssl_verify_mode :verify_peer
==> develop: 
==> develop:   # OR, Verify only connections to chef-server
==> develop:   verify_api_cert true
==> develop: ```
==> develop: 
==> develop: To check your SSL configuration, or troubleshoot errors, you can use the
==> develop: `knife ssl check` command like so:
==> develop: 
==> develop: ```
==> develop:   knife ssl check -c /tmp/vagrant-chef-2/solo.rb
==> develop: ```
==> develop: 
==> develop: * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
==> develop: [2014-11-25T16:30:57+00:00] INFO: *** Chef 11.16.4 ***
==> develop: [2014-11-25T16:30:57+00:00] INFO: Chef-client pid: 2306
==> develop: [2014-11-25T16:30:57+00:00] DEBUG: Chef-client request_id: 45494694-3ef0-4c40-abfc-faa48c83b4b8
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Building node object for develop
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Extracting run list from JSON attributes provided on command line
==> develop: [2014-11-25T16:31:03+00:00] INFO: Setting the run_list to ["recipe[apt]", "recipe[phpenv::default]"] from CLI options
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Applying attributes from json file
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Platform is ubuntu version 14.04
==> develop: [2014-11-25T16:31:03+00:00] INFO: Run List is [recipe[apt], recipe[phpenv::default]]
==> develop: [2014-11-25T16:31:03+00:00] INFO: Run List expands to [apt, phpenv::default]
==> develop: [2014-11-25T16:31:03+00:00] INFO: Starting Chef Run for develop
==> develop: [2014-11-25T16:31:03+00:00] INFO: Running start handlers
==> develop: [2014-11-25T16:31:03+00:00] INFO: Start handlers complete.
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: Re-raising exception: ArgumentError - You must specify at least one cookbook repo path
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/cookbook_loader.rb:43:in `initialize'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `new'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `setup_run_context'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:265:in `setup_run_context'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:429:in `do_run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:213:in `block in run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `fork'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:236:in `run_chef_client'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:226:in `block in run_application'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `loop'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `run_application'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:55:in `run'
==> develop:   /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/bin/chef-solo:25:in `<top (required)>'
==> develop:   /usr/bin/chef-solo:23:in `load'
==> develop:   /usr/bin/chef-solo:23:in `<main>'
==> develop: [2014-11-25T16:31:03+00:00] ERROR: Running exception handlers
==> develop: [2014-11-25T16:31:03+00:00] ERROR: Exception handlers complete
==> develop: [2014-11-25T16:31:03+00:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out
==> develop: [2014-11-25T16:31:03+00:00] DEBUG: ArgumentError: You must specify at least one cookbook repo path
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/cookbook_loader.rb:43:in `initialize'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `new'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/policy_builder/expand_node_object.rb:60:in `setup_run_context'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:265:in `setup_run_context'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:429:in `do_run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:213:in `block in run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `fork'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/client.rb:207:in `run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:236:in `run_chef_client'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:226:in `block in run_application'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `loop'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application/solo.rb:218:in `run_application'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/lib/chef/application.rb:55:in `run'
==> develop: /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.16.4/bin/chef-solo:25:in `<top (required)>'
==> develop: /usr/bin/chef-solo:23:in `load'
==> develop: /usr/bin/chef-solo:23:in `<main>'
==> develop: [2014-11-25T16:31:04+00:00] ERROR: You must specify at least one cookbook repo path
==> develop: [2014-11-25T16:31:04+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
Chef never successfully completed! Any errors should be visible in the
output above. Please fix your recipes so that they properly complete.

対応

なんのこっちゃない、自分の書いたVagrantfileにミスがありました。
  config.vm.define :develop do |develop|
    develop.omnibus.chef_version = :latest
    develop.vm.hostname = "develop"
    develop.vm.box = "opscode-ubuntu-14.04"
    develop.vm.box_url = "http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_ubuntu-14.04_chef-provisionerless.box"
    develop.vm.network :private_network, ip: "192.168.33.10"

    develop.vm.synced_folder "application", "/var/www/application/current",
      id: "vagrant-root", :nfs => false,
      :owner => "vagrant",
      :group => "www-data",
      :mount_options => ["dmode=775,fmode=775"]

    develop.vm.provision :chef_solo do |chef|
      chef.log_level = "debug"
#      chef.cookbooks_path = ".cookbooks"
      chef.cookbooks_path = "./cookbooks"
      chef.json = {
        nginx: {
          docroot: {
            owner: "vagrant",
            group: "vagrant",
            path: "/var/www/application/current/app/webroot",
            force_create: true
          },
          default: {
            fastcgi_params: { CAKE_ENV: "development" }
          },
          test: {
            available: true,
            fastcgi_params: { CAKE_ENV: "test" }
          }
        }
      }
      chef.run_list = %w[
        recipe[apt]
        recipe[phpenv::default]
      ]
    end
  end
16行目のスラッシュが抜けてただけっていうね。凡ミスでした。

【Vagrant、Ubuntu】stdin: is not tty


vagrantでubuntu立ち上げてchef-soloでprovisionしたときにエラーした。

エラー

==> develop: stdin: is not a tty

対応

ここに載ってた
https://github.com/mitchellh/vagrant/issues/1673

Yeah this is a known "thing."
It is not really a problem because it doesn't really cause a problem.
Actually, the reason this error message even appears is due to a bug
in Ubuntu not checking whether stdin is a TTY, and just assuming it is.
ほっとけばよさそうね。

2014年11月21日金曜日

【Vagrant】Failed to mount folders in Linux guest.


vagrant upしたときにこんなエラーがでることがある。

エラー

Failed to mount folders in Linux guest.

エラー全文

c:\vm\vagrant>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'centos7'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: vagrant_default_1416540764834_66350
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/vm/vagrant
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

対応

下記記事を参考に
http://qiita.com/osamu1203/items/10e19c74c912d303ca0b

すでに仮想環境’default’は起動しているようで、
$ vagrant ssh
で起動した仮想マシンへ接続
[vagrant@localhost ~]$ sudo /etc/init.d/vboxadd setup
これがリビルドなのかな?

[vagrant@localhost ~]$ exit
sshを抜けて
Connection to 127.0.0.1 closed.
naichilabmba:vagrant hu$ vagrant halt
==> default: Attempting graceful shutdown of VM...
vagrant haltで仮想マシン停止。もう一度vagrant upで成功した。

2014年11月20日木曜日

【Vagrant】仮想環境構築が超絶簡単になる(らしい)Vagrantを試してみた。

vagrantのロゴ。かっこいい。

はじめに

お久しぶりです。@naichilabです。
最近「けいぞくてきいんてぐれーしょん」ってのに興味を持ったので下記本を買ってみました。
CakePHPで学ぶ継続的インテグレーションCakePHPで学ぶ継続的インテグレーション
渡辺 一宏,吉羽 龍太郎,岸田 健一郎,穴澤 康裕,丸山 弘詩
少しずつ読み進めてたんですが知らん言葉やソフトが出てくる出てくる。

・バージョン管理システム - Git
・デプロイツール - Capistrano
・プロビジョニングツール - Chef
・サーバ仮想化ツール - VirtualBox
・環境構築ツール - Vagrant
・テストツール - PHPUnit
・インスペクションツール - PHP_CodeSniffer
・ドキュメント自動生成ツール - phpDocumentor
・継続的インテグレーションツール - Jenkins
・パッケージ管理ツール - Composer

設定はRubyで書いたり(Ruby触った事ない)仮想環境はUNIXだったり(UNIX触った事ない)と頭パンクしそう。
でもなんとなくVagrantが重要そうだなーと思ったのでさきにそっちで遊んでみました。


参考

ぐぐって見つけた下記本を購入。
Vagrant入門ガイドVagrant入門ガイド
新原雅司
400円!!52ページ!!なんと手頃な。
とても分かりやすかったしオススメ。

Vagrantって?


  • 開発環境を自動で構築するためのツール
  • OSXやWindows、Linuxなど幅広い環境で動く
  • VirtualBoxやVMWareといった仮想化ツールへの環境構築を自動化する
  • ChefやPuppetといったプロビジョニングツールも組み合わせる事で極端な話コマンド1行で環境構築終わり。といったことが可能になる。
っていう夢のようなソフト。らしい。実際まだ良くわかってない。

やってみる

環境

2014/11/19現在
MacBookAir 2013モデル
MacOSX 10.9.4
VirtualBox 4.3.18(最新版)
Vagrant 1.6.5(最新版)

インストール

以下からVirtualBoxをインストール
  https://www.virtualbox.org/wiki/Downloads
以下からVagrantをインストール
  https://www.vagrantup.com/
RubyはVagrantのパッケージに付いてくるらしい。

Vagrantのバージョンの確認

ターミナルで下記を実行。バージョンが出ればOK。
$ vagrant -v
Vagrant 1.6.5

Vagrantのコマンド

Vagrantは
$ vagrant ○○
というコマンドで操作する。
コマンド一覧は
$ vagrant -h
で確認できる。少ないし使ってればすぐに覚えられそう。

Boxファイル

Vagrantでは仮想マシンのベースとなるイメージファイル(Boxファイル)を使う。
やさしい人たちが色んなパターンを用意してくれてるみたい。

http://www.vagrantbox.es/
とりあえずぐぐって見つけたこのサイトからCentOSの一番新しそうなのを使ってみる。
CentOS7.0 x86_64 minimal (VirtualBoxGuestAddtions 4.3.14)ってやつ

Boxファイルの追加

$ vagrant box add [名前] [BOXファイルのURL]
これでvagrantがboxファイルをダウンロードしてくれて付けた名前で記憶してくれる。
こんな感じ
$ vagrant box add centos70 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
==> box: Adding box 'centos70' (v0) for provider: 
    box: Downloading: https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
==> box: Successfully added box 'centos70' (v0) for 'virtualbox'!

Boxファイルの確認

vagrant box listコマンドで追加されているBOX一覧を確認できる。
$ vagrant box list
centos70             (virtualbox, 0)
ちゃんと出てくる。あら素敵。


基準となるフォルダを決める

適当にフォルダを作る。
適当な場所に"vagrant"ってフォルダを用意した。
ターミナルのカレントフォルダをそこに移動しておく。
naichilabmba:vagrant hu$ 
PC名やユーザー名は適当に読み替えて。

Vagrantfileの作成

VagrantではVagrantfileというファイルに起動する仮想マシンの構成などを記載する。
とりあえずboxだけを指定したシンプルなVagrantfileを生成する。
$ vagrant init [box名]
これでVagrantfileが作られる。
$ vagrant init centos70
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
できたVagrantfileはこんな感じ。(長いrubyファイルなんだけどコメント部分を削除するとこれだけ)
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos70"
end
boxファイルの名前を指定してるだけですね。

仮想マシンの起動

ではお待ちかね。起動してみます。
$ vagrant up
これだけ。これだけで起動する…はずがエラーした。

エラー対処

別記事にまとめました。
【Vagrant】Failed to mount folders in Linux guest.

これで起動完了。

SSH接続

作成した仮想マシンへのSSH接続するのは
$ vagrant ssh
これだけ。仮想マシン側にsshdが起動している必要があるらしいけどたぶんboxファイルにする前に設定済みなんだろうね。
naichilabmba:vagrant hu$ vagrant ssh
Last login: Wed Nov 19 11:15:42 2014 from 10.0.2.2
[vagrant@localhost ~]$ exit
ログアウト
Connection to 127.0.0.1 closed.
めっちゃ楽。

状態確認

仮想マシンがどういう状態かは
$ vagrant status
で確認可能。
vagrant upした後ならこんな感じ。
$ vagrant status
Current machine states:
default      running (virtualbox)

仮想マシンの停止と破棄

upした仮想マシンを停止したければ
$ vagrant halt
これだけ。またupすれば使える。
もし完全に破棄したければ
$ vagrant destroy
こんな感じ。
破棄してもまたupすればすぐに使えるんだけどね。

まとめ

とりあえずboxの追加とそれを使った仮想マシンの作成・起動・停止・破棄だけやってみた。Vagrantfileさえ用意しておけば数個のコマンドを覚えるだけで仮想マシンの使い捨てができる。すげー楽。ほんと楽。

Vagrantfileを編集すれば複数の仮想マシンを一気に起動したり(webサーバ、dbサーバ、開発サーバとか)、起動後の更新を自動化したり、色々できるらしい。

ぼっちCI(継続的インテグレーション)を回せるように少しずつ覚えよう。

とりあえず今日はここまで。
Related Posts Plugin for WordPress, Blogger...