もなかアイスの試食品

「とりあえずやってみたい」そんな気持ちが先走りすぎて挫折が多い私のメモ書きみたいなものです.

Vagrantでロードバランサ+WEBサーバ×2+DBを構築

はじめに

Webアプリやら常駐サービスを開発するときに、いつも新しく仮想サーバを作成するのだけれども、容量がでかいし、構築に時間がかかる。

「いつか使うかも」って思って、全然消さなかったりする

一緒に開発するからといって、仮想サーバを渡しても、IPアドレスが変わったりして、普段気にしない環境が変わるので面倒臭い

あと開発に関わる人全員が、環境構築ができる訳ではないし

いい加減、環境構築のハードルを下げないとな~と思い、前々から使ってみようと思っていたVagrantを使ってみた


目次


構築する環境

  • DBサーバ(PostgreSQL 9.6)
    • CPU:2コア
    • MEM:1GB
  • nginx(ロードバランサ目的)
    • CPU:1コア
    • MEM:512MB
  • Webサーバ(Tomcat 8.5)×2台
    • CPU:2コア
    • MEM:1GB
  • 全部CentOS7

Vagrantプラグインの追加

設定ファイルの転送等で共有フォルダを使用するが、共有フォルダをマウントする際にエラーが発生する。

エラーを防ぐため、以下のコマンドでプラグインを最初にインストールする。

参考サイト

qiita.com

vagrant plugin install vagrant-vbguest

ベースのbox作成

DBサーバ、WEBサーバを構築する前にCentOS7に共通な設定・更新を実施し、元になるboxを作成する。

※元になるboxを作成する前は、何回も仮想環境を作り直して、新しい仮想PCができるたびに「yum update」やら「Guest Additions」の更新が走ったりとかなり時間がかかった・・・

まず、作業ディレクトリにて「vagrant init」を実行

作成された「Vagrantfile」を以下のように編集した

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

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"

  config.vm.provider "virtualbox" do |vb|
    vb.memory = "512"
  end

  config.vm.provision "shell", inline: <<-SHELL
# いつものやーつ
sudo yum update -y
sudo yum install vim wget -y

# 時刻を日本にする
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime

# 時刻を自動で調整するようにする
cp /etc/chrony.conf /etc/chrony.conf_preprovision
sudo sed -i -e "s/server 0.centos.pool.ntp.org iburst/server ntp.nict.jp/g" /etc/chrony.conf
sudo sed -i -e "s/server 1.centos.pool.ntp.org iburst/server ntp1.jst.mfeed.ad.jp/g" /etc/chrony.conf
sudo sed -i -e "s/server 2.centos.pool.ntp.org iburst/server ntp2.jst.mfeed.ad.jp/g" /etc/chrony.conf
sudo sed -i -e "s/server 3.centos.pool.ntp.org iburst/server ntp3.jst.mfeed.ad.jp/g" /etc/chrony.conf
sudo chronyc -a makestep

# 空き領域をゼロ埋めするために一時ディレクトリ/tmpに適当なファイルZEROを作成。中身はキッチリゼロ埋めされる。
sudo dd if=/dev/zero of=/tmp/ZERO bs=1M
sudo rm -f /tmp/ZERO
  SHELL

end

空き領域をゼロ埋めしているのは、boxサイズを小さくするため

以下のサイトのコメントを参考にした。

qiita.com

編集が終わったら以下のコマンドを実行し仮想OSを作成する

vagrant up

vagrant up」完了後、パッケージ・boxを作成(名前はmy_base_centos7にした)

vagrant package
vagrant box add my_base_centos7 package.box

もう要らないので後片付け

vagrant destroy

エクスプローラからpackage.boxの削除する

Vagrantfileの作成

Vagrantfileを以下のようにした

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

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

  config.vm.synced_folder "./synced", "/vagrant_data", create: true

  config.vm.define :db do |db|
    db.vm.hostname = "mt-db"
    db.vm.provision "db", type: "shell", :path => "create_db_server.sh", :privileged => false
    db.vm.network :forwarded_port, id: "ssh", guest: 22, host: 7022
    db.vm.network "forwarded_port", guest: 5432, host: 5432
    db.vm.network "private_network", ip: "192.168.33.10"
    db.vm.provider "virtualbox" do |db_vb|
      db_vb.name = "mt_db"
      db_vb.cpus = 2
      db_vb.memory = "1024"
    end
  end

  config.vm.define :proxy do |proxy|
    proxy.vm.hostname = "mt-proxy"
    proxy.vm.provision "proxy", type: "shell", :path => "create_proxy_server.sh", :privileged => false
    proxy.vm.network :forwarded_port, id: "ssh", guest: 22, host: 7122
    proxy.vm.network "forwarded_port", guest: 8888, host: 8888
    proxy.vm.network "private_network", ip: "192.168.33.11"
    proxy.vm.provider "virtualbox" do |proxy_vb|
      proxy_vb.name = "mt_proxy"
      proxy_vb.cpus = 1
      proxy_vb.memory = "512"
    end
  end

  config.vm.define :web1 do |web1|
    web1.vm.hostname = "mt-web1"
    web1.vm.provision "web1", type: "shell", :path => "create_web_server.sh", :privileged => false
    web1.vm.network :forwarded_port, id: "ssh", guest: 22, host: 7222
    web1.vm.network "private_network", ip: "192.168.33.12"
    web1.vm.provider "virtualbox" do |web1_vb|
      web1_vb.name = "mt_web1"
      web1_vb.cpus = 2
      web1_vb.memory = "1024"
    end
  end

  config.vm.define :web2 do |web2|
    web2.vm.hostname = "mt-web2"
    web2.vm.provision "web2", type: "shell", :path => "create_web_server.sh", :privileged => false
    web2.vm.network :forwarded_port, id: "ssh", guest: 22, host: 7322
    web2.vm.network "private_network", ip: "192.168.33.13"
    web2.vm.provider "virtualbox" do |web2_vb|
      web2_vb.name = "mt_web2"
      web2_vb.cpus = 2
      web2_vb.memory = "1024"
    end
  end

end

フォルダ構成はこんな感じ

C:.
│  create_db_server.sh---------DB構築スクリプト
│  create_proxy_server.sh------nginx構築スクリプト
│  create_web_server.sh--------Tomcat構築スクリプト
│  Vagrantfile
│
├─.vagrant
│
└─synced--------仮想マシンと同期するフォルダ
    ├─db
    │      sample_db.dump.bz2---------DBダンプ
    │      set_password_to_db.sql-----パスワード設定SQL
    │
    ├─proxy
    │      404.html-------------NotFound画面
    │      maintenance.html-----メンテナンス画面
    │      nginx.conf-----------nginxの設定ファイル
    │      nginx.service--------自動起動の設定ファイル
    │
    └─web
            sample.war----------配置WEBアプリ
            tomcat.service------自動起動の設定ファイル
            tomcat.sh-----------/etc/profile.dに配置

「create_db_server.sh」「create_proxy_server.sh」「create_web_server.sh」には、サーバを構築するためのコマンドが入っている。

あまり参考にならないであろうプロビジョニングスクリプト


create_db_server.sh(PostgreSQL構築)


参考

monakaice88.hatenablog.com


create_proxy_server.sh(ロードバランサnginx構築)


参考

monakaice88.hatenablog.com


create_web_server.sh(Webサーバ構築)


参考

monakaice88.hatenablog.com

終わりに

少々複雑なサーバ構成でも、他の人に渡すときはVagrantfile+αで済むのはありがたいし、変更内容は基本プロビジョニングした時のスクリプトを見れば大丈夫なのは良いですな。

ただプロビジョニングのスクリプトを作成するのには凄い時間が掛かった・・・

最初に共通で使用するboxを作成しておけば、もう少し苦労が少なかったかも