LoginSignup
3
3

More than 5 years have passed since last update.

Vagrant+Chefを使ってVirtualBoxにLAMP開発環境を作りCakePHPのマイグレーションをかける。

Last updated at Posted at 2015-12-19

今年、先生から出された課題が「Vagrantを使った開発環境の構築」で、その成果をまとめます。
最初に言われた時は「Vagrantって何?え??何者なん??というか環境構築とか大嫌いなんだけど!」と思いつつ、この半年くらいの土日はチョコチョコと調査&作業をしていた形です。
開発環境としてはMacを使っています。

Vagrant

Vagrantインストール

下記のサイトからインストールのためのファイルをダウンロードしてインストール。
https://www.vagrantup.com/downloads.html

Omnibusをインストール

vagrantを起動する時にChefが入っているか確認してインストールするvagrant-omnibusをインストールしておきます。
vagrant plugin install vagrant-omnibus

VagrantのBoxを作成する

最初にVagrant環境を作るのに必要なBoxを下記コマンドで作成します。
vagrant init <BOXの名前> <パス/BOXファイル>
使用するBOXファイルについては貰い物でも自分が作成した環境をエクスポートしたヤツでも良いですが、下記サイトの中から見つけたものにするのも可能です。
http://www.vagrantbox.es/
このサイトからBoxファイルを取得する場合には、以下のようなコマンドになります。
vagrant init NewChefTest http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box

Vagrantfileを書く

Vagrantを起動する際に必要なVagarntfileを作成します。

Vagrantfile
Vagrant.configure(2) do |config|
    #使用するBoxの名前
    config.vm.box = "NewChefTest"
    # sshポートフォワーディングを設定する
    config.ssh.forward_agent = true
    # BOXを入れる際に使用したBOXのパス
    config.vm.box_url = "http://puppet-vagrant-boxes.puppetlabs.com/centos-64-x64-vbox4210.box"
    #VirtualBoxの設定
    config.vm.provider "virtualbox" do |vb|
        #VirtualBox上の名前
        vb.name = "NewCentOS"
    end
    #vagrant環境の80ポートをホスト環境の8080ポートに繋げる。
    config.vm.network :forwarded_port, guest: 80, host: 8080
    #ホストオンリーアダプター
    config.vm.network "private_network", ip: "192.168.33.10"
    # ChefをVMにインストールするプラグイン
    config.omnibus.chef_version = "12.0.3"
    # Chefの設定
    config.vm.provision "chef_solo" do |chef|
        # cookbooksの場所を指定します
        chef.cookbooks_path = "./Chef"
        # SetUpCentOSという名前のCookBookを適用
        chef.run_list = %w[recipe[SetUpCentOS]]
    end
end

Chef

Chef Solo をインストール

下記のサイトからインストールのためのファイルをダウンロードしてインストール。
https://downloads.chef.io/chef-dk/

knifeSolo をインストール

下記のサイトに従ってKnife-soloをインストール。
http://matschaffer.github.io/knife-solo/

Cookbookを作成

作業フォルダ内でknife cookbook create <cookbook名> -o <作成先ディレクトリ>でcookbookを作成します。
cookbook名はVagrantfileの「chef.run_list」で設定したcookbook名に、作成先ディレクトリはVagrantFileの「chef.cookbooks_path」で設定したディレクトリにします。
knife cookbook create SetUpCentOS -o Chef

recipeを書く

大事なrecipeを書きます。これに色々な設定やらインストールやらの記述をします。
recipeファイルはcookbook内のrecipes/default.rbに記載します。
また、CentOS内に配置するファイルはfiles/defaultの中に配置してます。

Apache・mysqlなどをインストール

packageでインストールします。yumでインストールできるものはyum_を付けてインストールします。何がyumでインストール出来て何が出来ないかは、よく分からない…。

yum_package "httpd"
yum_package "git"
yum_package "php"
yum_package "php-common"
yum_package "php-mbstring"
yum_package "php-xml"
yum_package "php-devel"
yum_package "php-process"
yum_package "php-cli"
yum_package "php-pear"
yum_package "php-mysql"
yum_package "mysql-server"
yum_package "openssh"
yum_package "openssh-server"

Gitリポジトリの取得

開発に必要なリポジトリをcloneしてきます。

  • publicリポジトリ
    公開されているリポジトリに関しては、特に特殊な処理は必要ありません。今回は、この後CakePHPのマイグレーションに必要なリポジトリをcloneしてみます。
git "・・・・/app/Plugin/Migrations" do
  repository "https://github.com/CakeDC/migrations.git"
  revision "master"
  action :sync
end
  • privateリポジトリ
    この場合は、少し工夫が必要です。手順としては、
  1. 公開鍵を作成する
  2. その鍵を予め自分の鍵として登録しておく
  3. その鍵を仮想環境内に配置する

という作業が必要になってきます。
下記のような処理になります。

# 用意しておいた公開鍵・秘密鍵をサーバに移行する
directory "/root/.ssh" do
  action :create
  mode   "700"
end
cookbook_file "/root/.ssh/id_rsa" do
  source "id_rsa"
  mode   "600"
end
file "/root/.ssh/privateRepository.sh" do
  mode "700"
  content <<-EOL
    #!/bin/bash
    ssh -i /root/.ssh/id_rsa -o "StrictHostKeyChecking=no" "$@"
  EOL
end

# リポジトリclone
git <クローンする先のパス> do
  repository <リポジトリのURL>
  revision "master"
  action :sync
  ssh_wrapper "/root/.ssh/privateRepository.sh"
end

こちらのサイトをもとに処理を作成しました。
http://ikosin.hatenablog.com/entry/2014/09/12/121612

CakePHPのパーミッション設定 (tmp)

CakePHPといえばtmpのパーミッション設定はかかせない作業です。
単純に1つのディレクトリのパーミッションを設定するのならば、以下のような形で良いです。

directory "・・・/app/tmp" do
  owner 'vagrant'
  group 'apache'
  mode "777"
end

ですが、何個もこのような記載をしていると、かなり長文になってしまいます。
そういう場合は、このように記載できます。

permissions = [
    "/var/www/html/・・・", 
    "/var/www/html/・・・/app/tmp", 
    "/var/www/html/・・・/app/tmp/cache",
    "/var/www/html/・・・/app/tmp/cache/persistent" ,
    "/var/www/html/・・・/app/tmp/cache/models",
    "/var/www/html/・・・/app/tmp/logs"
]
permissions.each do |path|
  directory path do
   owner 'apache'
   group 'apache'
   mode "757"
  end
end

マイグレーションをする

マイグレーションを行います。そのためには「PHPの時刻設定」「データベース作成」が必要なので、その処理を作っていきます。

  • mysqlサーバの起動
    マイグレーション作業に必要になるのでMySQLサーバを立ち上げます。
service "mysqld" do
    # OSブート時のサービス有効をenabled,:startでサービスを起動
    action [ :enable, :start ] 
end
  • php.iniの時刻設定
    あらかじめphp.iniを書いておき、そのファイルを配置します。
cookbook_file "/etc/php.ini" do
  source "php.ini"
  mode   "644"
end
  • データベース作成
    必要なデータベースを作成します。下記のようなSQLファイルを用意しておき、それを実行します。
createDatabase.sql
CREATE DATABASE <データベース名>;

このSQLファイルを実行します。

execute "create_db" do
  command "mysql -uroot  < ・・・/createDatabase.sql"
  user "root"
end
  • マイグレーション実行
    マイグレーション実行処理の記述は以下です。
bash "migration" do
  cwd "・・・/app"
  code <<-EOH
    ./Console/cake Migrations.migration status
    ./Console/cake Migrations.migration run all
  EOH
end

Webサーバの設定・起動

最後にWebサーバの設定・起動を行います。

  • iptablesの設定
    iptablesは開発環境でもあるし無効にしてしまいます。本番サーバとかでは、ちゃんと設定しましょうね。
service 'iptables' do
 # OSブート時のサービス有効をdisable,:stopでサービス停止
  action [:disable, :stop]
end
  • Apacheの起動
    Apacheの起動処理を書きます。以下の記載です。
service "httpd" do
   # OSブート時のサービス有効をenabled,:startでサービスを起動
  action [ :enable, :start ]
end

以上のことを踏まえて記載したレシピがこちらです。

recipes/default.rb
#
# Cookbook Name:: Chef
# Recipe:: default
#
# Copyright 2015, hoge
#
# All rights reserved - Do Not Redistribute
#

# 1. Apacheとmysqlとgitをインストール
yum_package "httpd"
yum_package "git"
yum_package "php"
yum_package "php-common"
yum_package "php-mbstring"
yum_package "php-xml"
yum_package "php-devel"
yum_package "php-process"
yum_package "php-cli"
yum_package "php-pear"
yum_package "php-mysql"
yum_package "mysql-server"
yum_package "openssh"
yum_package "openssh-server"

# 2. 用意しておいた公開鍵・秘密鍵をサーバに移行する
directory "/root/.ssh" do
  action :create
  mode   "700"
end
cookbook_file "/root/.ssh/id_rsa" do
  source "id_rsa"
  mode   "600"
end
file "/root/.ssh/privateRepository.sh" do
  mode "700"
  content <<-EOL
    #!/bin/bash
    ssh -i /root/.ssh/id_rsa -o "StrictHostKeyChecking=no" "$@"
  EOL
end

# 3.リポジトリclone
# private
git "/var/www/html/・・・" do
  repository <リポジトリのURL>
  ssh_wrapper "/root/.ssh/privateRepository.sh" #privateリポジトリの際に記載
end
# public
git "/var/www/html/・・・/app/Plugin/Migrations" do
  repository "https://github.com/CakeDC/migrations.git"
  revision "master"
  action :sync
end

# 4./var/www/html/以下のパーミッションを設定
permissions = [
    "/var/www/html/・・・", 
    "/var/www/html/・・・/app/tmp", 
    "/var/www/html/・・・/app/tmp/cache",
    "/var/www/html/・・・/tmp/cache/persistent" ,
    "/var/www/html/・・・/tmp/cache/models",
    "/var/www/html/・・・/tmp/logs"
]
permissions.each do |path|
  directory path do
   owner 'apache'
   group 'apache'
   mode "757"
  end
end

# 5.マイグレーション設定
#mysql起動
service "mysqld" do
    # OSブート時のサービス有効をenabled,:startでサービスを起動
    action [ :enable, :start ] 
end
# php.iniの時刻設定
cookbook_file "/etc/php.ini" do
  source "php.ini"
  mode   "644"
end
#データベース作成
cookbook_file "/var/www/html/・・・/createDatabase.sql" do
  source "createDatabase.sql"
  mode   "600"
end
execute "create_db" do
  command "mysql -uroot  < /var/www/html/・・・/createDatabase.sql"
  user "root"
end
#マイグレーション
bash "migration" do
  cwd "/var/www/html/・・・/app"
  code <<-EOH
    ./Console/cake Migrations.migration status
    ./Console/cake Migrations.migration run all
  EOH
end

# 6.web設定
#iptables無効
service 'iptables' do
 # OSブート時のサービス有効をdisable,:stopでサービス停止
  action [:disable, :stop]
end
#apache起動
service "httpd" do
   # OSブート時のサービス有効をenabled,:startでサービスを起動
  action [ :enable, :start ]
end

起動する

上記の作業が終わったら、Vagrantfileがあるディレクトリでvagrant upコマンドを打ってvagrantを起動してください。
しばらくしたら、環境が出来上がっているはずです。

環境にログインする

無事に起動したらvagrant sshでログインします。
最初はvagrantユーザでログインになっています。rootで作業したい場合にはsuを打ってください。初期パスワードはvagrantです。
なお、他に使う頻度の多いコマンドは以下に書きます。他にも、わんさかありますが。

  • vagrant環境を停止 → vagrant halt
  • vagrant環境を削除 → vagrant destroy

最初はイヤイヤだったにせよ、今は色々勉強になって良かったかなと思います。
『こぉぉぉのポンコツがぁぁぁぁっ!!!:pig_nose:と言われながらも頑張りました。
まだまだ至らないところも多いので、優しい意見・感想は大歓迎です。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3