5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

なんか布教したいエンジニアAdvent Calendar 2019

Day 9

ShellScriptで環境構築を自動化

Last updated at Posted at 2019-12-08

なんか布教したいエンジニア Advent Calendar 2019の9日目の記事です。

はじめに

会社のサーバーをバックアップするスクリプトを触り、自分でも何か作りたいと思い作りました。
また、初学者が環境構築で躓いてしまうのはとてももったいないと思うので良ければこれを使ってみてほしいです。
ソース

ソースと一緒にこの記事を読んでいただけるとより理解できると思います。

環境

OS: Windows10
VagrantVirtualBoxCmderを使うのでダウンロードとインストールをしておいてください。

スクリプトの説明

このスクリプトはvagrantとvirtualboxを用いて仮想環境を構築する一連の作業を自動化したものです。
流れとしては

  1. ディレクトリの作成
  2. vagrant init の実行
  3. Vagranfileの書き換え
  4. vagrant provisionに必要なスクリプトの作成
  5. vagrant up の実行
    です。

スクリプトの実行には引数が2つ必要です。
1つはディレクトリの名前
もう1つは仮想マシンの種類です。

1.ディレクトリの作成

まず初めにVagrantfileを置いておくファイルを作成します。
自分の場合はC:\Users\username\VMというディレクトリをROOTディレクトリとして作成し、その中に引数で受け取ったディレクトリを作成しています。

setup.sh
DIR_NAME=$1

cd $ROOT_DIR
if [ ! -d "$DIR_NAME" ]; then
  mkdir $ROOT_DIR/$DIR_NAME
fi

解説

ROOT_DIRという変数には$HOME/VMが代入されています。
この$HOME/VMC:\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です。(ここは適宜変更してください。)

setup.sh
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を作成します。

setup.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に記述されたコマンドを実行し、仮想マシンのセットアップを行います。

最後に

以上が今回作成した環境構築自動化スクリプトの大体の流れです。
私は楽するためと勉強を兼ねてこのスクリプトを作成しましたが、環境構築に躓く初心者の方がこれを使ってプログラミングを楽しくできたらいいなと思います。

稚拙な文で分かりづらいかと思います。何か質問等あればコメントにお願いします。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?