サーバに触れてみる(2)【Vagrant+Ansibleで3層Webアプリケーションの開発環境を構築する】

前回更新より約三ヶ月ぶりの更新です

その間何をやっていたかというと,二ヶ月間くらいは学校で好きなもの作れよみたいなチーム課題でゲーム作ってました

残りの一か月は遊んでました

というわけで今回の更新分は今週一週間の作業報告みたいなものになります.

ちなみに三か月前に作った仮想環境ですが,ぶっ壊れてました

泣きました

VMwareを更新したらネットワーク周りの動作がおかしくなったので更新が原因だと思うんですが結局直ることはありませんでした

そこらへんも含めて今回はやっていこうと思います

今回の目的

今回はいわゆる3層webアプリケーションの開発環境(今回はnginx+Django+MariaDB)を構築したいと思います

もちろん開発環境を構築したので何かしら作ろうと思っています

…というか,本当は概ね考えているんですけどそれぞれの機能をちゃんと把握していないのできちんと設計ができないという感じですね.

f:id:ymzkmtfm:20170901181019p:plain

それはさておき今回作成する環境は図にするとこんな感じです

3台のマシンの上にそれぞれ必要なプログラムを入れて通信させてwebアプリケーションを実現する形ですね

多分定番な形になっているはずです

あと,今回はいわゆるフロントエンドといわれるような技術(今だとReact.jsとかでしょうか)はあまり触れていません

ですからバックエンド,あるいはインフラ周りの話になるかと思いますのであらかじめご了承ください

なんで三台なのか

こんなことを書く必要があるかは不明ですが,一応この形にする理由をまとめておきたいと思います

f:id:ymzkmtfm:20170901191746p:plain

まずは一番素朴な構成だとこうなると思います.ブラウザがサーバにリクエストを渡してHTMLを返してもらう構成ですね.

これはとてもシンプルな構成ですが,これでは1+1の結果を返すこともできませんし(多分頑張ればできる),アカウントの管理も認証もできません

f:id:ymzkmtfm:20170901194930p:plain

そこで先ほどの構成になります.webサーバにはHTMLとかそこらへんだけを任せてデータベースにデータをためてその中間でこねこねする構成です.こうすると役割が分担できて便利です.

たとえばクックパッドを見てみましょう

 

cookpad.com

検索欄に「素麺」とか適当な単語を入れるとレシピの検索結果が返ってくると思います

内部構成がどうなっているのか定かではないので何とも言えませんがデータベースにレシピを保存して,アプリケーションサーバで検索/並び替えをしてwebサーバが返しているって感じじゃないかなと思います.本当のところどうなっているかは多分調べれば出てくると思うんで気になる人は調べてみるといいと思います

とにかく三層にするとそれぞれ役割与えてそれに特化させて色々カスタマイズがきいて便利だから今回はそうします

余談ですがwebサービスってデータを作る人と消費する人が同じなもの(ツイッターとかニコニコ動画とか)とwebサービスを提供する人が作ってるもの(ニュース系とか)と他人の作ったものを提供しているもの(amazonとかnetflixとか)とか色々あってなんだかちょっと面白いですね

どうやって三台のマシンを用意するのか

今回の構成ですが三台のマシンを用意します(本当は一台のマシンの中に入れてもいいんですけどね)

さすがに本物のパソコン三台用意できるわけじゃないので仮想マシン(今回はVirtualBox+Vagrant)にCentOS7を入れて使っていきたいと思います.

また,CentOSの中の設定を自動化するためにAnsibleを使いたいと思います

f:id:ymzkmtfm:20170901205825p:plain

図にするとこんな感じです.いきなり色々出てきたので一旦整理します.

VirtualBoxは簡単に言うとパソコンをソフトで実現したものです.似たようなソフトにVMwareとかがあります.こいつを使ってやれば一台のマシンの中にソフトウェアとして何台でも(リソースが許す限り)マシンを起動させることができます.ここにOSを入れてやればしっかりその数だけOSが起動します.今回は後述のVagrantと親和性が高いらしいのでこいつを使うことにしました.

VagrantVirtualBoxをはじめとした仮想化ソフトウェアを使いやすくしてくれるツールです.Vagrantfileと呼ばれるファイルに色々書いてやるとその設定で仮想マシンを作ってくれます.しかもかなり早く作ってくれるので仮想マシンを起動したり全部消してやり直したりのサイクルがかなり早くなります.これがないとVirtualBoxの設定とかOSのインストールとかにかなり時間を取られます.代わりになるソフトがあるかはよくわかりません

f:id:ymzkmtfm:20170901215254p:plain

Ansibleは新しいサーバに必要なものをインストールしたり,起動時にやる処理を自動化したりするソフトです.こういった初期設定をやってくれるソフトをプロビジョナーっていいうとか言わないとか.似たものにChefとかPuppetとかがあるらしいです.AnsibleはChefやPuppetに比べて簡単らしいので今回はこれにしました.その代わりAnsibleはChefとかに比べて複雑な管理が面倒らしいので数千台以上のサーバを管理するときはChefとかの方がいいらしいです.実際はよくわかりません.

f:id:ymzkmtfm:20170901223133p:plain

もちろん新しいサーバにはansibleが入っていないのでansible用のサーバが必要です.しかし今回はAnsibleのインストールと実行をそれぞれのマシンでやってもらいます.手動でやってはAnsibleとVagrantのありがたみがないのですが,Vagrantに設定すれば全部自動でやってくれます.つまり,VagrantとAnsibleの設定をしっかりしてやれば「色々設定してあるマシン×3を壊してもう一回同じ状態に戻す」というサイクルを「vagrant up」という1コマンドで全部自動化できます.ついでに設定がファイルで管理されているのでバージョン管理とかリファクタリングとかできますし,なんならテストもできます.使ってみると結構便利です.

それでは題名にも書いてあるとおりVagrantとAnsibleで環境を作りましょう

Vagrantの設定

Vagrantを使うには仮想化ソフトがないと始まりません

というわけでVirtualBoxをインストールします

https://www.virtualbox.org/

終わったらVagrantをインストールします

https://www.vagrantup.com/

あとはインストールするOSなんですが,生のisoではなくboxというファイルを使うので

https://app.vagrantup.com/boxes/search

ここから見つけます,ダウンロードする必要はないです

ここからの作業はコマンドプロンプトPowerShellかを使って進めていきます

まずは

mkdir vagrant

cd vagrant

などで適当に作業フォルダを作って移動します.そしたら見つけたboxのページに書いてある指示に従ってvagrantを初期化します.

CentOS7だと

vagrant init centos/7

ですね.Vagrantfileというファイルができたと思います.Vagrantに必要なのはそのファイルだけです.このファイルに従って仮想マシンが構成されます.

例えば一台のマシンを起動する場合はVagrantfileをこのようにします.起動の際は

vagrant up

とすると起動できます.確認してみてください.起動できた場合は

vargrant ssh

仮想マシンにログインできます.

作成した仮想マシンを削除するときは

vagrant destroy

です.

今回は三台のマシンを使うのでVagrantfileをこのようにします.細かいことは感じ取ってください.intentとかなんとか書いてあるのはマシン同士を通信させるのに必要らしいです.APサーバがappサーバなのは趣味です.できたらvagrant upしてみてください.

ちなみにそれぞれ名前がついてるのですが,この名前を使って個別に操作できます.例えば

vagrant ssh web

とすればwebサーバに入れます.

vagrant destroy db

とすればdbサーバだけ破壊できます.作成のし直しも同じ感じでできます.

あとは何をインストールするのかとかそういったことですが,そこはほとんどAnsibleの役目なのでAnsibleの話に移ります

Ansibleの設定

ansibleはインストールする必要ありません.そもそもwindowsだと動かないとかなんとか.

なのでいきなり設定ファイルの編集です.Ansibleに必要なファイルは指示と対象を結びつけるhostsファイルと具体的な指示を書く.ymlファイルです.

まずはhostsファイルです.ここにはansibleが対象とするhostたちのIPアドレスとかもろもろ必要な情報を書きます.先ほども言ったようにもともとサーバーにインストールするものなのでこんな構成になっていますが,今回はそれぞれ自分にインストールして自分で実行していただくのでかなり簡素な作りになります.というか全部localhostになります.

実際に三台のマシンに使うhostsファイルがこちらになります.[ ]で囲まれている部分はホストの役割みたいなものです.これのおかげでwebサーバー用の構成をすればいいのかDBサーバ用の構成をすればいいのかがわかるようになります.

あとは実際の指示を書くymlファイルです.これはちょっと面倒で,公式のBestPracticesに書いてあるフォルダ構成が推奨されています.

http://docs.ansible.com/ansible/latest/playbooks_best_practices.html

この構成に従わないならなんかべたべた一枚のファイルに書いちゃえばいいと思います.とりあえず大切なのはconnection: localって書いておくことです.詳細は面倒なので省きます.githubに全部上げたので感じ取ってください.実際僕にもよくわかりません

github.com

さて,出来上がったらVagrantに組み込みます.といってもVagrantfileに追加するだけです

大切なのはlimitで自分が何者か教えてあげることです.これをやらないと自分が何者かわからなくなったマシンたちが全部インストールし始めます(それでもいいんですけどね)

全部できたら

vagrant up

してください.vagrant sshで中に指定したものが入っていると思います.

 

これでマシンの構成は概ね終わりました.

今はdjangoチュートリアルをやってます.これが終わったら設計に入って一個くらいは今月中に完成させたいと思います