VagrantとさくらVPSに

Rails環境構築

(CentOS6, MySQL, Nginx,Rails4)

vagrant & ansible

Goal

Deploy

Provision

Code As Infrastructure

 
  • 安心して開発環境を構築する
    
  • 開発端末の故障による被害を軽減する
  • 開発効率の向上
  • デプロイ時の苦痛を軽減する

The VM manager

The Provisioning tool

 
  • サーバ設定を行うツール
  • パッケージをインストール
  • 設定ファイルを更新

Puppet, Chef, Ansible, ...?

The deployment tool

 

 

  • pushes the project on the server
  • runs migration
  • clear caches...

The Deployment tool

it can deploy non ruby application

So why ansible and not puppet/chef

  • シンプル(ymlのみ)
  • エージェント不要
  • Daemons不要
  • pythonとopensshがあれば動く
  • Listen Port不要

How it works?

Vagrant 

 
  • ネットワーク設定(ポート転送)
  • (optional)Provisioner
Vagrant.configure("2") do |config|

  config.vm.define :web do |web_config|
    web_config.vm.box = "centos64"
    #web_config.vm.box_url = "http://files.vagrantup.com/precise64.box"
    web_config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.5-x86_64-v20140110.box"
    web_config.vm.network :private_network, ip: "33.33.33.33"
    web_config.vm.network :forwarded_port, guest: 3000, host: 8080

    web_config.vm.hostname = "develop-centos"

    web_config.vm.provider :virtualbox do |vb|
      vb.memory = 1024
    end

    config.vm.provision :ansible do |ansible|
      ansible.playbook = "provision/playbook_vagrant.yml"
      ansible.inventory_path = "provision/dev_hosts"
      ansible.limit = 'all'
      ansible.verbose = 'vvv'
    end
  end

end

Ansible

 
  • Roles(設定項目をグルーピング)
  • Host(対象ホストの選択)
  • Variables

playbook_vagrant.yml

- name: setting rails to server
  hosts: dev_server
  user: vagrant
  sudo: yes
  vars:
    app_name: geeknews
    environtment: vagrant
    mysql_port: 3306
    home: "/home/{{user}}"
    user: vagrant
    src_dir: '/usr/local/src'
    ruby_version: '2.1.2'

    rails:
      dir: /var/www/rails/
  roles:
    - common
    - mysql
    - ruby
    - rails
    #- nginx

反省

Moduleを使う

 
Module > Command > Shell

 

ShellやCommandは検査の機構が無く、

現状と結果の差を確認せずにコマンドを実行してしまう

Use Specific Version of Rails

 

Railsとか、PlayBookの中でバージョンを

指定した方が良いのでは?

厳密な冪等性を保てないのでは。。。

forksを設定する

 
  • デフォルト値は5
  • 50とか、500以上でも大丈夫らしい
  -f FORKS, --forks=FORKS
                        specify number of parallel processes to use
                        (default=5)

ドキドキする時

  -C, --check           don't make any changes; instead, try to predict some
                        of the changes that may occur
  --step                one-step-at-a-time: confirm each task before running
 
  • dry runする
  • -- stepで1つずつ実行する

運用開始後

ansible-playbook provisioning/production_web.yml --tags "nginx"
 
  • 毎回、全部のtaskを実行してたら時間が掛かりすぎる
  • タグを指定してプロビジョニングする

どうやってテストするの?

 
  • role単位(何度繰り返しても同じ結果になることを確認)
  • 全体を通してテスト(roleの順番、パッケージの依存関係による問題がないことを確認)
  • 再起動してみるテスト(再起動したときにnginxが起動しているか等)
  • 誰かにレビューしてもらう、試してもらう
  • ServerSpec

Deploying to Production Using Ansible

namespace :deploy do
  desc 'Deploy using Ansible'

  task :ansible do
    hosts = "#{Rails.root}/playbook/hosts"
    playbook = "#{Rails.root}/playbook/deploy.yml"
    system "ansible-playbook -i #{hosts} #{playbook}"
  end
end

rake deploy:ansible

https://github.com/hico-horiuchi/ansible-rails-deploy

Source Code

https://github.com/tjnet/vagrant_sakuravps_rails

2014.11.11.study_group

By Jun Tanaka

2014.11.11.study_group

This will provision a Rails box suitable for production sakura VPS use running Nginx, Unicorn and MySQL on a CentOS 6.x server or local Vagrant environment. It should allow you to have a development environment that is identical to your production environment

  • 1,410