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

  • 2
    Like
  • 0
    Comment
More than 1 year has passed since last update.

今年、先生から出された課題が「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:と言われながらも頑張りました。
まだまだ至らないところも多いので、優しい意見・感想は大歓迎です。