はじめに
このページで得られるもの
vagrant環境の設定方法を習得
前提
- VirtualBox, vagrantをインストール済み
- ホームディレクトリにソースディレクトリ(Sites), vagrant設定ディレクトリ(Vagrant)が存在すること ※ディレクトリパスは任意です。
- 開発環境用の自己証明書を作成していること(今回はmkcertコマンドで作成)
開発環境
macOS Catalina(version 10.15.5)
設定ファイル
適宜読み替えてください
Vagrant/test.com/Vagrantfile
# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| # centos 8.1 install config.vm.box = "centos/8" config.vm.box_url = "http://cloud.centos.org/centos/8/x86_64/images/CentOS-8-Vagrant-8.1.1911-20200113.3.x86_64.vagrant-virtualbox.box" # boxの名前 config.vm.define "test" # プライベートネットワーク(自身のみアクセス可のipアドレス指定) config.vm.network "private_network", ip: "192.168.33.10" # スマホや別端末からアクセス許可(とりあえず同じWifi内の端末) config.vm.network :public_network, bridge: 'en0: Wi-Fi (AirPort)' # /etc/hostsへ自動書き込み(box起動中の間のみ) config.vm.hostname = "local.test.com" # 初めてのvagrant upの時 config.vm.provision :shell, :path => "~/Vagrant/test.com/provision/provision.sh" config.vm.provision :shell, privileged: true, :path => "~/Vagrant/test.com/provision/setup_postgresql.sh" config.vm.provision :shell, privileged: true, :path => "~/Vagrant/test.com/provision/setup_php.sh" config.vm.provision :shell, privileged: true, :path => "~/Vagrant/test.com/provision/setup_nginx.sh" # 証明書を連携したいため config.vm.provision :shell, privileged: true, :path => "~/Vagrant/test.com/provision/setup_nvm.sh" # node.js config.vm.provision :shell, privileged: true, :path => "~/Vagrant/test.com/provision/setup_other.sh" # selinuxとか # 共有フォルダ設定 config.vm.synced_folder "~/Sites/test.com", "/var/www/vhosts/local.test.com", :owner => "vagrant", :group => "vagrant", :mount_options => ["dmode=777","fmode=777"], type: "virtualbox" # disksize custmize (vagrant plugin install vagrant-disksize) config.disksize.size = "40GB" config.vm.synced_folder ".", "/vagrant", :mount_options => ["dmode=777","fmode=777"], type: "virtualbox" # 毎回実行 config.vm.provision "shell", run: "always", :path => "start.sh" # vagrant up 高速化 https://qiita.com/hayatoise/items/8621e140e9ec321fdf88 config.vm.provider "virtualbox" do |vb| vb.customize ["modifyvm", :id, "--natdnshostresolver1", "on"] vb.gui = false vb.memory = "2048" end end
Vagrant/test.com/provision/provision.sh
#!/bin/bash systemctl stop firewalld systemctl disable firewalld timedatectl set-timezone Asia/Tokyo localectl set-locale LANG=ja_JP.UTF-8 source /etc/locale.conf # langpacks-jaは以下のエラーが出るため必要となるパッケージ # default: Failed to set locale, defaulting to C dnf install -y langpacks-ja dnf install -y vim git wget locate # nkfコマンド ## centos8が新しいからかnkfコマンドがDLできない。centos7から借りる rpm -Uvh http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/n/nkf-2.1.3-5.el7.x86_64.rpm dnf -y update
Vagrant/test.com/provision/setup_postgresql.sh
#!/bin/bash echo '########### set up 「postgresql12」start ###########' dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm dnf -qy module disable postgresql #デフォルトのモジュールはmodule disableで無効 dnf install -y postgresql12 postgresql12-devel postgresql12-server postgresql12-contrib # 自動起動設定 systemctl enable postgresql-12.service # データベースクラスタ作成 if [ -z "$(ls /var/lib/pgsql/12/data/pg_hba.conf)" ]; then PGSETUP_INITDB_OPTIONS="-E UTF8 --no-locale" /usr/pgsql-12/bin/postgresql-12-setup initdb fi # postgresql.conf if [ ! "$(cat /var/lib/pgsql/12/data/postgresql.conf | grep '### torikky add config ###')" ]; then echo "### torikky add config ###" >>/var/lib/pgsql/12/data/postgresql.conf echo "listen_addresses = '*'" >>/var/lib/pgsql/12/data/postgresql.conf fi # pg_hba.conf if [ ! "$(cat /var/lib/pgsql/12/data/pg_hba.conf | grep 'torikky add config')" ]; then mv /var/lib/pgsql/12/data/pg_hba.conf /var/lib/pgsql/12/data/pg_hba.conf.${ymd} cat <<'EOF' >>/var/lib/pgsql/12/data/pg_hba.conf # that name. # # This file is read on server startup and when the server receives a # SIGHUP signal. If you edit the file on a running system, you have to # SIGHUP the server for the changes to take effect, run "pg_ctl reload", # or execute "SELECT pg_reload_conf()". # # Put your actual configuration here # ---------------------------------- # # If you want to allow non-local connections, you need to add more # "host" records. In that case you will also need to make PostgreSQL # listen on a non-local interface via the listen_addresses # configuration parameter, or via the -i or -h command line switches. # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: #host all all 127.0.0.1/32 ident host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 ident # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 ident host replication all ::1/128 ident host all all all trust # あまり良くないが。。。 EOF fi # postgresユーザのパスワード設定 export PGHOST=localhost export PGPORT=5432 export PGDATABASE=test export PGSCHEMA=public export PGUSER=postgres export PGPASSWORD=postgres export CREATEDATABASE=${PGDATABASE} su - postgres psql ${PGDATABASE} -c "alter role postgres with password 'postgres';" createdb ${CREATEDATABASE} \q echo '########### set up 「postgresql12」 end ###########'
Vagrant/test.com/provision/setup_php.sh
#!/bin/bash echo '########### set up 「php」start ###########' # 初期設定 ymd=$(date +%Y%m%d) phpenv_root="/usr/local/phpenv" version="7.4.4" # TODO 入力させてそのバージョンをインストールできるようにしたい。 # TODO /usr/local内でglobalに参照できるやり方へ修正 # phpenv if [ ! -e ${phpenv_root} ]; then mkdir ${phpenv_root} chmod 755 ${phpenv_root} git clone git://github.com/phpenv/phpenv.git ${phpenv_root} fi if [ ! -e ${phpenv_root}/plugins ]; then mkdir ${phpenv_root}/plugins fi if [ ! -e ${phpenv_root}/plugins/php-build ]; then git clone https://github.com/php-build/php-build ${phpenv_root}/plugins/php-build fi # php 7.4.4 なら確実にOK ※他のバージョンはわかりません。 dnf install -y libxml2-devel openssl-libs openssl-devel sqlite-devel bzip2-devel libcurl-devel libpng-devel libjpeg-devel libicu-devel gcc-c++ oniguruma readline-devel libxslt-devel libzip libzip-devel autoconf libpq-devel dnf install -y http://mirror.centos.org/centos/8/PowerTools/x86_64/os/Packages/oniguruma-devel-6.8.2-1.el8.x86_64.rpm dnf install -y https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/l/libtidy-5.6.0-5.el8.x86_64.rpm dnf install -y https://download-ib01.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/l/libtidy-devel-5.6.0-5.el8.x86_64.rpm # PATH設定 if [ ! "$(cat ~/.bashrc | grep 'phpenv')" ]; then cat <<'EOF' >>~/.bashrc # home directory pattern # export PATH="$HOME/.phpenv/bin:$PATH" # custom root directory pattern export PHPENV_ROOT='/usr/local/phpenv' export PATH="$PHPENV_ROOT/bin:$PATH" eval "$(phpenv init -)" EOF source ~/.bashrc fi # postgres driver if [ ! "$(cat ${phpenv_root}/plugins/php-build/share/php-build/default_configure_options | grep 'pgsql')" ]; then cp ${phpenv_root}/plugins/php-build/share/php-build/default_configure_options ${phpenv_root}/plugins/php-build/share/php-build/default_configure_options.${ymd} cat <<'EOF' >>/usr/local/phpenv/plugins/php-build/share/php-build/default_configure_options --with-pgsql --with-pdo-pgsql EOF fi # とりあえず7.4.4 TODO いずれバージョンを選べるようにしたいね。 echo '#### php install start ####' phpenv install 7.4.4 phpenv global 7.4.4 echo '#### php install end ####' # phpenv設定ファイル修正 ※ @で置換前と置換後の文字列区別し、シングルクォートで空白丸ごと文字列として認識させる if [ "$(cat ${phpenv_root}/versions/${version}/etc/php-fpm.conf | grep ';pid = run/php-fpm.pid')" ]; then sed -i.${ymd} -e s@';pid = run/php-fpm.pid'@'pid = /run/php-fpm.pid'@ ${phpenv_root}/versions/${version}/etc/php-fpm.conf fi if [ "$(cat ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf | grep 'nobody')" ]; then sed -i.${ymd} -e s@'user = nobody'@'user = nginx'@ ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf sed -i.${ymd} -e s@'group = nobody'@'group = nginx'@ ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf sed -i.${ymd} -e s@'listen = 127.0.0.1:9000'@'listen = /run/php-fpm.sock'@ ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf sed -i.${ymd} -e s@';listen.owner = nobody'@'listen.owner = nginx'@ ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf sed -i.${ymd} -e s@';listen.group = nginx'@'listen.group = nginx'@ ${phpenv_root}/versions/${version}/etc/php-fpm.d/www.conf fi # コマンドの登録 if [ ! -e ${phpenv_root}/versions/${version}/bin/php-fpm ]; then ln -nfs ${phpenv_root}/versions/${version}/sbin/php-fpm ${phpenv_root}/versions/${version}/bin/php-fpm phpenv rehash ln -nfs ${phpenv_root}/shims/php /usr/local/bin/php ln -nfs ${phpenv_root}/shims/phar /usr/local/bin/phar ln -nfs ${phpenv_root}/shims/php-config /usr/local/bin/php-config ln -nfs ${phpenv_root}/shims/phpize /usr/local/bin/phpize ln -nfs ${phpenv_root}/shims/php-fpm /sbin/php-fpm fi # サービスの登録 cat <<'EOF' >/etc/systemd/system/php-fpm.service [Unit] Description=PHP FastCGI Process Manager After=network.target nginx.service [Service] Type=forking PIDFile=/run/php-fpm.pid ExecStartPre=/usr/bin/rm -f /run/php-fpm.pid ExecStart=/sbin/php-fpm -D #ExecReload=/bin/kill -s HUP $MAINPID #KillSignal=SIGQUIT #TimeoutStopSec=5 #KillMode=control-group #PrivateTmp=true [Install] WantedBy=multi-user.target EOF # xdebugの設定 if [ ! "$(cat ${phpenv_root}/versions/${version}/etc/conf.d/xdebug.ini | grep 'xdebug add config')" ]; then cp ${phpenv_root}/versions/${version}/etc/conf.d/xdebug.ini ${phpenv_root}/versions/${version}/etc/conf.d/xdebug.ini.${ymd} cat <<'EOF' >>/usr/local/phpenv/versions/${version}/etc/conf.d/xdebug.ini # xdebug add config remote_autostart=1 xdebug.remote_enable=1 xdebug.remote_host=192.168.33.1 xdebug.idekey=PHPSTORM xdebug.remote_port=9001 EOF fi systemctl enable php-fpm echo '########### set up 「php」 end ###########'
Vagrant/test.com/provision/setup_nginx.sh
#!/bin/bash echo '########### set up 「nginx」start ###########' dnf install -y nginx # 証明書関連を格納(予め mkcert で自己証明書作成していること) if [ ! -e /etc/nginx/ssl ]; then mkdir /etc/nginx/ssl fi cp /vagrant/_wildcard.test.com+4* /etc/nginx/ssl chmod 700 /etc/nginx/ssl | chown root:root /etc/nginx/ssl/* | chmod 600 /etc/nginx/ssl/* # サイトの設定ファイル作成 cat <<'EOF' > /etc/nginx/conf.d/test.conf server { listen 443 ssl; server_name local.test.com; root /var/www/vhosts/local.test.com/public; index index.php index.html index.htm; # 大きいファイル対応 ※拡張が必要な場合はコメントインしてください。 #client_max_body_size 20M; # 自己署名証明書 ssl_certificate /etc/nginx/ssl/_wildcard.test.com+4.pem; # 暗号化鍵 ssl_certificate_key /etc/nginx/ssl/_wildcard.test.com+4-key.pem; charset utf-8; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; location / { try_files $uri $uri/ /index.php?$query_string; } # redirect server error pages to the static page /50x.html error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # pass the PHP scripts to FastCGI server listening on php-fpm.sock; location ~ \.php$ { include fastcgi_params; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass unix:/run/php-fpm.sock; try_files $uri =404; } } EOF systemctl daemon-reload systemctl enable nginx echo '########### set up 「nginx」 end ###########'
Vagrant/test.com/provision/setup_nvm.sh
#!/bin/bash echo '########### set up 「nvm」start ###########' if [ ! -e ~/.nvm ]; then git clone https://github.com/creationix/nvm.git ~/.nvm fi if [ ! "$(cat ~/.bash_profile | grep 'nvm')" ]; then cat <<'EOF' >>~/.bash_profile # nvmの実行 if [[ -s ~/.nvm/nvm.sh ]]; then source ~/.nvm/nvm.sh fi EOF source ~/.bash_profile fi nvm install stable # 安定版インストール npm -g install npm-check-updates ncu -u npm -g install echo '########### set up 「nvm」 end ###########'
Vagrant/test.com/provision/setup_other.sh
#!/bin/bash echo '########### set up 「other」start ###########' # selinux無効化 ※置換文字列に空白やスラッシュが入っていないためこれでOK if [ "$(cat /etc/selinux/config | grep 'SELINUX=enforcing')" ]; then sed -i.${ymd} -e "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config fi echo '########### set up 「other」end ###########' 共有 :
最後に
今回、開発環境の自動構築設定について共有しました。
背景として新サービス構築にあたりその仮想環境をどうにか自動化できないかなと思い試行錯誤しました。また、今後もサービスの構築やらでリソースを取られるのも嫌でしたのでvagrantの機能を十二分に発揮したいなと考えて何とか着地しました。
今回共有した設定内容は、適宜環境に合わせて修正していただけばと思います。
Vagrantfileのprovisionを各モジュール単位に切り分けても良いし、一つのファイルにまとめてもよいと思います。自分の場合は各モジュール単位に切り分ければ他サービスを構築するとなっても必要な部分だけコピーしてそのまま流用できるかなと考えて上記のやり方にしてみました。
お役に立てれば幸いです。