はじめに
Webアプリやら常駐サービスを開発するときに、いつも新しく仮想サーバを作成するのだけれども、容量がでかいし、構築に時間がかかる。
「いつか使うかも」って思って、全然消さなかったりする
一緒に開発するからといって、仮想サーバを渡しても、IPアドレスが変わったりして、普段気にしない環境が変わるので面倒臭い
あと開発に関わる人全員が、環境構築ができる訳ではないし
いい加減、環境構築のハードルを下げないとな~と思い、前々から使ってみようと思っていたVagrantを使ってみた
目次
構築する環境
設定ファイルの転送等で共有フォルダを使用するが、共有フォルダをマウントする際にエラーが発生する。
エラーを防ぐため、以下のコマンドでプラグインを最初にインストールする。
参考サイト
qiita.com
vagrant plugin install vagrant-vbguest
ベースのbox作成
DBサーバ、WEBサーバを構築する前にCentOS7に共通な設定・更新を実施し、元になるboxを作成する。
※元になるboxを作成する前は、何回も仮想環境を作り直して、新しい仮想PCができるたびに「yum update」やら「Guest Additions」の更新が走ったりとかなり時間がかかった・・・
まず、作業ディレクトリにて「vagrant init」を実行
作成された「Vagrantfile」を以下のように編集した
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を以下のようにした
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構築)
sudo yum update -y
sudo chronyc -a makestep
sudo rpm -U https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm
sudo yum install -y postgresql96 postgresql96-server
sudo su -
sudo su postgres -c "/usr/pgsql-9.6/bin/initdb /var/lib/pgsql/9.6/data/"
PG_DIR="/var/lib/pgsql/9.6/data/"
sudo su postgres -c "cp ${PG_DIR}postgresql.conf ${PG_DIR}postgresql.conf_preprovision"
sudo sed -i -e "s/#listen_addresses = 'localhost'/listen_addresses = '*'/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/log_filename = 'postgresql-%a.log'/log_filename = 'postgresql-%m%d.log'/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/#log_checkpoints = off/log_checkpoints = on/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/#log_connections = off/log_connections = on/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/#log_disconnections = off/log_disconnections = on/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/#log_lock_waits = off/log_lock_waits = on/g" ${PG_DIR}postgresql.conf
sudo sed -i -e "s/log_timezone = 'UTC'/log_timezone = 'Japan'/g" ${PG_DIR}postgresql.conf
sudo su postgres -c "cp ${PG_DIR}pg_hba.conf ${PG_DIR}pg_hba.conf_preprovision"
sudo sed -i -e "87i host all all 192.168.33.0/24 md5" ${PG_DIR}pg_hba.conf
sudo systemctl enable postgresql-9.6
sudo systemctl start postgresql-9.6
sudo createdb -U postgres sample_db
bzip2 -dc /vagrant_data/db/sample_db.dump.bz2 | sudo psql -U postgres sample_db > /dev/null
sudo psql -U postgres sample_db < /vagrant_data/db/set_password_to_db.sql
# 使用しているBoxでは、firewallが入ってないので、ポート開放の設定をしない
# sudo firewall-cmd --set-default-zone=drop
# sudo firewall-cmd --add-service=ssh
# sudo firewall-cmd --add-service=postgresql
# sudo firewall-cmd --reload
echo "Db server provisioning script is finished!!!"
参考
monakaice88.hatenablog.com
create_proxy_server.sh(ロードバランサnginx構築)
sudo yum update -y
sudo chronyc -a makestep
sudo yum groupinstall -y "Development Tools"
sudo yum install -y epel-release
sudo yum install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel
cd /usr/local/src
sudo wget http://nginx.org/download/nginx-1.13.7.tar.gz && sudo tar zxvf nginx-1.13.7.tar.gz
sudo wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz && sudo tar xzvf pcre-8.41.tar.gz
sudo wget https://www.zlib.net/zlib-1.2.11.tar.gz && sudo tar xzvf zlib-1.2.11.tar.gz
sudo wget https://www.openssl.org/source/openssl-1.1.0g.tar.gz && sudo tar xzvf openssl-1.1.0g.tar.gz
sudo wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/1.2.6.tar.gz -O nginx-sticky-module-ng-1.2.6.tar.gz && sudo tar xzvf nginx-sticky-module-ng-1.2.6.tar.gz
sudo mv nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d nginx-sticky-module-ng-1.2.6
sudo rm -rf *.tar.gz
sudo cp /usr/local/src/nginx-1.13.7/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
cd /usr/local/src/nginx-sticky-module-ng-1.2.6
sudo sed -i -e "12i #ifndef MD5_DIGEST_LENGTH" ngx_http_sticky_misc.c
sudo sed -i -e "13i #include " ngx_http_sticky_misc.c
sudo sed -i -e "14i #endif" ngx_http_sticky_misc.c
sudo sed -i -e "15i #ifndef SHA_DIGEST_LENGTH" ngx_http_sticky_misc.c
sudo sed -i -e "16i #include " ngx_http_sticky_misc.c
sudo sed -i -e "17i #endif" ngx_http_sticky_misc.c
cd /usr/local/src/nginx-1.13.7
sudo ./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=CentOS \
--builddir=nginx-1.13.7 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre=/usr/local/src/pcre-8.41 \
--with-pcre-jit \
--with-zlib=/usr/local/src/zlib-1.2.11 \
--with-openssl=/usr/local/src/openssl-1.1.0g \
--with-openssl-opt=no-nextprotoneg \
--with-debug \
--add-module=/usr/local/src/nginx-sticky-module-ng-1.2.6
sudo make
sudo make install
sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --user-group nginx
sudo mkdir -p /var/cache/nginx
sudo ln -s /usr/lib64/nginx/modules /etc/nginx/modules
sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_preprevision
sudo \cp -f /vagrant_data/proxy/nginx.conf /etc/nginx/nginx.conf
sudo cp /vagrant_data/proxy/nginx.service /usr/lib/systemd/system
sudo cp /vagrant_data/proxy/maintenance.html /etc/nginx/html
sudo cp /vagrant_data/proxy/404.html /etc/nginx/html
#sudo chown -R nginx /var/log/nginx
sudo setsebool -P httpd_can_network_connect 1
sudo systemctl enable nginx
sudo systemctl start nginx
echo "Proxy server provisioning script is finished!!!"
参考
monakaice88.hatenablog.com
create_web_server.sh(Webサーバ構築)
参考
monakaice88.hatenablog.com
終わりに
少々複雑なサーバ構成でも、他の人に渡すときはVagrantfile+αで済むのはありがたいし、変更内容は基本プロビジョニングした時のスクリプトを見れば大丈夫なのは良いですな。
ただプロビジョニングのスクリプトを作成するのには凄い時間が掛かった・・・
最初に共通で使用するboxを作成しておけば、もう少し苦労が少なかったかも