light log

学んだこととか

Vagrantfileにプロビジョニングを書いてみた

Vagrantfileにプロビジョニングを書いてみた。

chefもansibleも初期学習コストが高そうだし全然大したことやらないのでシェルで書いた。Vagrantのドキュメントにも

If you've never used a configuration management system before, it is recommended you start with basic shell scripts for provisioning.

と書かれてる。コンフィギュレーションマネジメントシステムをネバーユーズドな自分はシェルスクリプトがいい。

やってるのは以下。

  • Nginxを入れる
  • MySQLを入れる
  • rbenvとruby-buildを入れてRubyを入れる
  • NginxとMySQLをサービスとして立ち上げる

ディレクトリ構成

$ tree
.
├── Vagrantfile
└── provision
    ├── files
    │   ├── nginx.conf
    │   └── rails_app.conf
    └── scripts
        ├── provision.sh
        └── provision_root.sh

3 directories, 5 files

Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|
  config.vm.box = "centos6"

  config.vm.network "forwarded_port", guest: 80, host: 8080

  config.vm.provision "file", source: "~/.vimrc", destination: ".vimrc"
  config.vm.provision "file", source: "~/.gemrc", destination: ".gemrc"
  config.vm.provision "file", source: "provision/files/nginx.conf",
    destination: "nginx.conf"
  config.vm.provision "file", source: "provision/files/rails_app.conf",
    destination: "rails_app.conf"
  config.vm.provision "shell", path: 'provision/scripts/provision_root.sh'
  config.vm.provision "shell", path: 'provision/scripts/provision.sh', privileged: false
end

.vimrcと.gemrcは必須じゃないけど、後でsshで操作するときに使い勝手よくするためにコピーしてる。

privileged:オプション(デフォルトでtrue)の有無でrootで実行されるスクリプトとそうでないスクリプトを分けてる。

privileged: true(デフォルト)で指定したスクリプトの中の~はrootのホーム(/root)になるので注意。最初間違えた。

シェルスクリプト

provision/scripts/provision_root.sh

#!/bin/env bash

yum update -y
yum install -y vim
yum install -y openssl-devel # for Ruby

# Nginx
yum localinstall -y http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum install -y nginx

for i in /etc/nginx/conf.d/*; do mv $i $i.bk; done
mv nginx.conf /etc/nginx/
mv rails_app.conf /etc/nginx/conf.d/

# MySQL
yum localinstall -y http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum install -y mysql-community-server
yum install -y mysql-community-devel # for mysql2 gem

# Service
nginx
chkconfig nginx on
/etc/init.d/mysqld start
chkconfig mysqld on

provision/scripts/provision.sh

# Ruby
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
source ~/.bash_profile

rbenv install 2.2.2
rbenv global 2.2.2

gem install bundler --no-document
gem install rails --no-document

vimは必須じゃない。

config.vm.provision "file"は、vagrantユーザ(一般ユーザ)権限でscpされるとのことなので、nginxの設定ファイルはいったんホームディレクトリにコピーしてからシェルスクリプトで/etc/nginx以下に移動してる。もっといい方法ありそう。

nginxの設定ファイルは↓の記事で書いた通り。

yamacent.hatenablog.com

NginxとMySQLリポジトリ追加は↓。

yamacent.hatenablog.com

まとめ

いろいろ確信持たずにやってるけど、これで一応動いてるような気がする。

関連する記事

yamacent.hatenablog.com

yamacent.hatenablog.com

yamacent.hatenablog.com

Vagrant入門ガイド

Vagrant入門ガイド

実践 Vagrant

実践 Vagrant