今年、先生から出された課題が「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を作成します。
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リポジトリ
この場合は、少し工夫が必要です。手順としては、
- 公開鍵を作成する
- その鍵を予め自分の鍵として登録しておく
- その鍵を仮想環境内に配置する
という作業が必要になってきます。
下記のような処理になります。
# 用意しておいた公開鍵・秘密鍵をサーバに移行する
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ファイルを用意しておき、それを実行します。
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
以上のことを踏まえて記載したレシピがこちらです。
#
# 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
最初はイヤイヤだったにせよ、今は色々勉強になって良かったかなと思います。
『こぉぉぉのポンコツがぁぁぁぁっ!!!』と言われながらも頑張りました。
まだまだ至らないところも多いので、優しい意見・感想は大歓迎です。