なんか布教したいエンジニア Advent Calendar 2019の9日目の記事です。
はじめに
会社のサーバーをバックアップするスクリプトを触り、自分でも何か作りたいと思い作りました。
また、初学者が環境構築で躓いてしまうのはとてももったいないと思うので良ければこれを使ってみてほしいです。
ソース
ソースと一緒にこの記事を読んでいただけるとより理解できると思います。
環境
OS: Windows10
VagrantとVirtualBox、Cmderを使うのでダウンロードとインストールをしておいてください。
スクリプトの説明
このスクリプトはvagrantとvirtualboxを用いて仮想環境を構築する一連の作業を自動化したものです。
流れとしては
- ディレクトリの作成
- vagrant init の実行
- Vagranfileの書き換え
- vagrant provisionに必要なスクリプトの作成
- vagrant up の実行
です。
スクリプトの実行には引数が2つ必要です。
1つはディレクトリの名前
もう1つは仮想マシンの種類です。
1.ディレクトリの作成
まず初めにVagrantfileを置いておくファイルを作成します。
自分の場合はC:\Users\username\VM
というディレクトリをROOTディレクトリとして作成し、その中に引数で受け取ったディレクトリを作成しています。
DIR_NAME=$1
cd $ROOT_DIR
if [ ! -d "$DIR_NAME" ]; then
mkdir $ROOT_DIR/$DIR_NAME
fi
解説
ROOT_DIR
という変数には$HOME/VM
が代入されています。
この$HOME/VM
はC:\Users\username\VM
を表しています。
DIR_NAME=$1
この$1
は第一引数のことです。
sh setup.sh aaa
とコマンド実行した場合$1
にはaaa
が入ります。
また、後で出てくるのですが、$2
や$3
などもありそれぞれ第二引数、第三引数を表しています。
if [ ! -d "$DIR_NAME" ]; then
// 処理
fi
ここのif文は引数で受け取ったディレクトリ名が無い場合、そのディレクトリを作成するというものです。
-d
はディレクトリの有無を調べます。
2.vagrant initの実行とVagrantfileの書き換え
先ほど作成したディレクトリでvagrant init
を実行してVagrantfileを作成します。
init時にBoxも指定しています。
利用しているboxはbento/CentOS7.5です。(ここは適宜変更してください。)
count_dir
cd $ROOT_DIR/$DIR_NAME
vagrant init bento/centos-7.5
if [ -f Vagrantfile ]; then
sed -i '31a \ config.vm.network "forwarded_port" ,guest: 80, host: 8080, host_ip: "127.0.0.1"' Vagrantfile
sed -i '35a \ config.vm.network "private_network", ip: "192.168.33.10"\n config.vm.network :public_network, ip: "192.168.11.'$((100+$COUNT))'", bridged: "en1: Wi-Fi(AirPort)"' Vagrantfile
sed -i '69a \ config.vm.provision "shell", :path => "provision.sh", :privileged => false' Vagrantfile
fi
解説
if文の中ではVagranfileの書き換えを行っています。
一番上はフォワードポートを指定しています。
真ん中はパブリックネットワーク用のIPアドレスを指定しています。
count_dir
関数で取得したディレクトリの数に応じてIPアドレスが変わるようになっています。(この機能は作成当初必要かと思っていましたがよく考えたらいりませんでした。)
最後にvagrant provision
を利用する行を追加しています。
3.provision.shの準備
最後にprovision.shを作成します。
provision.shにはvagrant up時に実行させたいものを記述しておきます。
スクリプト内ではどのマシンでも行う共通のコマンドを記したcommon.shとそれぞれの環境で実行するコマンドを記したスクリプトがあります。
このcommon.shと各環境で実行するスクリプトを組み合わせてprovision.shを作成します。
case "$ENV_TYPE" in
"dev") cp -p $DEV/development.sh provision.sh.org ;;
*) ERROR_NUM=5
get_errormessages
exit ;;
esac
if [ -f provision.sh.org ]; then
cp -p $COMMON/common.sh common.sh
cp -p $COMMON/end.sh end.sh
cat common.sh provision.sh.org end.sh > provision.sh
rm common.sh provision.sh.org end.sh
fi
解説
$ENV_TYPEには第二引数で指定された仮想マシンの種類が入っています。(現状devのみ)
$ENV_TYPEがdevだったら指定したフォルダからスクリプトをコピーしてきます。
5. vagrant upの実行
あとはvagrant up を実行するだけです。
vagrant upした際に先ほど作成したprovision.shに記述されたコマンドを実行し、仮想マシンのセットアップを行います。
最後に
以上が今回作成した環境構築自動化スクリプトの大体の流れです。
私は楽するためと勉強を兼ねてこのスクリプトを作成しましたが、環境構築に躓く初心者の方がこれを使ってプログラミングを楽しくできたらいいなと思います。
稚拙な文で分かりづらいかと思います。何か質問等あればコメントにお願いします。