windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その5)itamaeを使って自動でLAMP環境構築するには

シェアする

Itamaeを使ったLAMP環境の構築

前回の記事「windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その4)手作業でLAMP環境構築」では、windows10のパソコンに、vagrant と Virtualbox を使って、CentOS7.5 を起動した状態で、apache2.4/PHP7.1/MySQL5.7 をインストールしてLAMP環境を構築する方法を説明しました。

今回は、Itamaeという環境構築ツールを使って、自動でLAMP環境を作る手順を説明します。

vagrant と VirtualBox (と仮想マシンにSSHするための Git for Windows) をインストールした状態から、一気にCentOS7/apache2.4/PHP7.1/MySQL5.7 のLAMP環境を自動で構築する手順を説明します。

記事「windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その3)LAMP環境構築の概略」にLAMP環境導入の作業の概略を書いてますが、Itamae を使って順番に自動で実行させます。

自動化したvagrantとItamaeの設定ファイル一式

とりあえず設定一式をツール置き場 に置きますので、展開して、vagrant の仮想マシン管理フォルダとして使ってみてください。

展開すると、以下のフォルダ・ファイル構成となってます。lsコマンドでの表示です。

図で示すと下の通りです。

Vagrantfileのあるフォルダを仮想マシン管理フォルダとして、 vagrant up  とコマンド入力すると、初回にプロビジョニングを行って、自動でCentOS7.5/apache2.4/mysql5.7/PHP7.1の環境を構築します。

ですが、使う前に、各ファイルの説明をしていきますね。

各ファイルの説明

autotest.zipで構築する仮想マシンは、記事「windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その4)手作業でLAMP環境構築」で手作業で構築したLAMP環境とほぼ同じです。

違いはというと、Itamaeという自動環境構築ツールをインストールしていることと、Itamaeを動かすために、ruby2.3をインストールしていることぐらいです。

では、Vagrantファイルから説明していきます。

 Vagrantfile

まず、Vagrantfileですが、 vagrant init したときにできるコメントを削ってます。

プロビジョニングコード

から、

で囲まれた間のコードは、プロビジョニング コードとして、初めて vagrant up したときと、 vagrant provision コマンドを入力したときに実行されます。実行は仮想マシン上で行われます。

この中で、自動設定を行うコードを書いていきます。

rubyインストールコード

手動設定ではなかったところなので、ちょっと詳しく説明します。

まず、

で、scl レポジトリを追加してます。

次に、 sudo yum install -y rh-ruby23 でrubyのバージョン2.3をインストールしてます。

そのあとの、

の部分は、インストールしたrubyが使えるように実行ファイルのパスを追加しているところです。

if文で条件分岐してます。もし、 grep 'rh-ruby23/enable' /etc/bashrc > /dev/null; という条件が成立したら すぐ下の echo コマンドを実行。この部分は、「すでに /etc/bashrc というファイルの中に rh-ruby23/enable という文字列があったら」という条件です。つまり「もうパスを設定してあったら」という意味になります。

echo 'すでに/etc/bashrcに追加済み' コマンドは、print文と同じで指定した文字列を画面に表示しているだけです。

else から fi で囲まれた部分は、if文で「そうでなかったら」実行されるコマンドたちです。

つまり、「パスが追加されてなかったら」実行される部分です。

echo 'source /opt/rh/rh-ruby23/enable' >> /etc/bashrc  は、「’source ・・・・・’ という文字列を /etc/bashrc というファイルの末尾に書き足せ」というコマンドです。末尾に追加されます。

source というのは、「設定ファイルを読み込んで有効にする」の意味です。

bashrcというのは、bashというシェルの初期設定ファイルです。とくに/etcフォルダにあるのは、全ユーザで共通部分の初期設定ファイルとなります。

次のコマンド source ~/.bashrc は、「~/.bashrc というbashシェルの設定ファイルを読み込んで有効にする」という意味です。

~ というフォルダは、カレント(現在の)ユーザのホームディレクトリという意味です。.bashrc は、各ユーザごとのbashシェルの初期設定ファイルです。

つまり、 /etc/bashrc ファイルを書き換えたので、シェルの設定を読み直そうということです。これによって、追加したrubyのパスの設定が有効になります。

コマンド履歴への日時追加設定

手作業での追加の時と内容は同じになってますが、プロビジョニングをやるごとに追加しないように、先ほどと同様にif文と grep コマンド で HISTTIMEFORMAT という文字列が追加済みかどうかをチェックしています。

if grep 'HISTTIMEFORMAT' /etc/bashrc > /dev/null; then は、「すでに HISTTIMEFORMAT の文字列が /etc/bashrcファイルの中にあれば」という条件文です。TRUE(成立)であれば、画面表示のみ。FALSE(不成立)であれば、 else  の後が設定を追加している部分です。

echo "export HISTTIMEFORMAT='%F %T '" >> /etc/bashrc で、/etc/bashrcファイルの末尾にexport文を追記しています。

itamaeのインストール

gem install itamaeで、itamaeをインストールしています。 gem はrubyのパッケージ管理ツールのコマンドです。

インストール後は、itamaeを使って自動構築を続けていきます。

itamae local --log-level=info /vagrant/itamae/recipe.rb コマンドでitamaeを実行してます。引数として、/vagrant/itamae/recipe.rb ファイルを指定します。

/vagrant は仮想マシン側から見た共有フォルダとなってます。

以下、recipe.rb の内容を見ていきましょう。

Itamaeでの自動構築内容 recipe.rb

ここからは、Itamaeを使った構築内容になります。

Vagrantでは、シェルコマンドを使うしかなかったのですが、Itamaeではそのほかにも便利なコマンドがあり、もうちょっと抽象的に指示することができ楽できます。例えば、CentOSのバージョン 6 と 7 でコマンドが違う場合も、同じ表現で済ますことができたりします。

下のリストが itamaeフォルダ内のrecipe.rbファイルです。

ここからは、手作業でインストールしたのと同じ内容を行っていってますが、Itamae のコマンドの説明を中心に行っていきます。

言語設定

言語設定している部分を抜き出します。

execute は、シェルコマンドを実行するブロックです。(ブロックは、doからendまでです。)

executeの直後の’locale’ 部分は、名称です。自由につけてOKです。

userは、実行するユーザ名、この場合、管理者(root)で実行します。

command は実行するコマンドです。<<-EOL と EOL で囲まれた行が順番に実行されます。

実行されるコマンド、

は手作業と全く同じですが、ユーザ指定を別途行っているのでsudoは不要です。

タイムゾーンを東京に設定

下リストが対象のコードです。言語設定と同じくexecuteブロックを使用しています。

別ファイルの読み出し・実行

vimなどの別ソフトインストール、apache、php、mysql のインストールはそれぞれ別のレシピ(設定)ファイルに記述してます。

ここで順番に読みだして実行してます。

Apacheのデーモン(再)起動・自動起動設定

最後に、apacheの起動を行っています。php、mysql などのインストールが終わった後に起動する必要があるため、一番最後に記述しています。

apacheのデーモンの名前は httpd です。

ここは、CentOS6とCentOS7で、サービス起動のコマンド、OS起動時にサービス起動するためのコマンドが違うのですが、Itamae では、serviceブロックのaction で指定することにより、サービスの起動や停止、自動起動登録を行うことができます。

以下、別ファイルに分けていた部分の自動構築内容について説明します。

Itamaeでの自動構築 other.rb

その他ツールのインストールをしているレシピ(自動構築の設定)です。

最初の行

は、rubyのeachブロックで、()内の各項目について、順番に do ~ end までのブロック内を実行します。

各項目は pkg  変数に代入されています。

で、 pkg を引数として、Itamaeの package ブロックが実行されています。

属性として、 action :install  としているので、各パッケージがインストールされます。

ここでは、git、vim、man、man-pages-ja の4つのパッケージをインストールしています。

Itamaeでの自動構築 apache.rb

apacheをインストールしています。

パッケージインストール

最初の

の部分は、other.rb の each ブロック内と全く同じで、パッケージ httpd をインストールしています。

バーチャルホストの設定

この部分は、remote_file ブロックで、ファイルを転送しています。

引数がターゲットとなるファイル、ここでは、 /etc/httpd/conf.d/vhost.conf としています。

source で、コピー元のファイルを指定します。このファイルからの相対パスで指定しています。

action :create というのは、ファイル作成の意味ですが、デフォルトになっているため記述を省略しても問題ありません。

で、vhost.conf の内容は下リストの通りです。

http://vagrant.lhost/、http://test.lhost/ でアクセスされたときと、その他(IPアドレスやほかのホスト.ドメイン名)でアクセスされたときの3通り設定しています。

Itamaeでの自動構築 php.rb

下のリストになります。

リポジトリの追加

まず、リポジトリを追加しています。

下リストのように、execute ブロックでコマンド実行していますが、 not_if  文がついているところが違います。

これは、not_if の引数のコマンドの実行結果がFALSE(不成立)の時だけ、command を実行するという意味になります。ここでは、「/etc/yum.repos.d フォルダの中に、epel.repo というファイルがなければ、コマンドを実行する(レポジトリを追加する)」という意味になります。

上のレポジトリ追加と全く同じロジックです。yumコマンドの対象が httpから始まるURLで指定しているところが違うところです。

PHPパッケージインストール

other.rb でもありましたが、each ブロックで複数のパッケージを連続してインストールしています。

php、php-gd、php-intl、php-json、php-mysqlnd、php-mbstringの各パッケージをインストールしています。

PHP7.1をインストールするために、 options "--enablerepo=remi-php71"  と、options アトリビュート(属性)で、レポジトリを指定しています。

phpMyAdminパッケージインストール

PHPのインストールと全く同様に、MySQLのWebからの管理ツール phpMyAdmin をインストールしています。

phpMyAdminのアクセス制限緩和の設定

このままだと、サーバー内からしかアクセスできなく不便なため、ホストOSからはアクセスできるように、アクセス制限を緩和する設定を行います。

まず、修正するファイル /etc/httpd/conf.d/phpMyAdmin.conf  のバックアップを取っています。 /etc/httpd/conf.d/phpMyAdmin.conf.bu ファイルがないときだけ、つまり、一回だけバックアップファイル作っています。

次に、file ブロックで ファイルを編集しています。

action に :edit を選択し、block ブロックで ファイル内容を修正しています。

content は ファイルの内容 を示します。

gsub は置換で ! を付けると「破壊的変更」ということで、元ファイルが変更されます。

たとえば、

では、「Require ip 127.0.0.1」という行を探してきて、「Require ip 192.168. 」という行を下に追加しています。Vagrantfile で、仮想マシンのIPアドレスを192.168.33.10 と指定しているため、ホストOSは192.168.x.x (xは任意)となっているので、ホストOSからもアクセスすることができるようになります。

Allow という文言でも同様に修正してます。apache は 2.2系 と 2.4系 で設定内容が違うため、Require と Allow と両方で設定しています。

また、

と、not_if 文をつけることで、すでに追加されていたら、再度追記しないようにしています。

Itamaeでの自動構築 mysql.rb

下のリストです。

リポジトリの追加

PHPインストール用のリポジトリ追加と同様の内容です。

コマンドでyumコマンドでインストールしている点、not_if でリポジトリがまだインストールされていないときだけ実行する点が同じです。

パッケージインストール

パッケージブロックでインストールしています。 options "--enablerepo=mysql57-community" と、リポジトリを指定するオプションを指定してます。

結局1パッケージだけだったので、eachブロックはいらなくなったのですが、下リストでは、1つの要素だけで、eachブロックを使用しています ^^;

設定ファイルのバックアップ

設定ファイル /etc/my.cnf を修正するため、バックアップしています。

not_if文で、バックアップファイルがないときだけ、つまり1回だけバックアップファイルを作成してます。

言語設定の追加

まず、変数 mycnf_setting に、追加する文字列を代入してます。

<<"EOL"  から EOL までが対象の文字列になります。

fileブロックでファイルの編集をします。

今回も block ブロックを使用していますが、gsub という置換は使ってません。

if not content =~ /default-character-set/ then というIF文で、content(ファイル内)に「default-character-set」という文字列がないときだけ追加するようにしてます。

if文の内部 content << mycnf_setting  で変数 mycnf_setting の内容を、ファイル内容 content の最後尾に追記しています。

サービスの(再)起動

serviceブロックで、サービスの(再)起動をします。mysql はインストール時に自動起動の登録がされているので、action に enable は設定していません。

初期パスワードの変更

厄介なことに、mysql5.7 では、初期パスワードは勝手に設定されて、変更しないとアクセスが制限されてしまいます。

初期パスワードは、/var/log/mysqld.log というログファイルに 「temporary pasword」というキーワードとともに記録されています。 

変更にはexecuteブロックでシェルコマンド実行という形で行ってます。

変更後のパスワードは仮に 12345aA! としています。運用するなら変更してください。デフォルト設定でパスワードに制約が設けられており、8文字以上、数字、英字の大文字、小文字、記号を入れることになっていますので、変更するときに注意してください。

何度provisionを実行してもパスワードの変更は1回だけ行うようにするため、 not_if 文で12345aA!でログインできるかをチェックしています。

パスワードを変更している文は、

と、ちょっと複雑になっているため説明します。

シェルのなかで、`(バッククオート) で囲まれた部分は実行されて結果文字列に変換されます。

例えば、 `date`  とすると、date を実行した後の「2019年 2月 9日 土曜日 17:36:13 JST」という文字列に変換されます。

‘(シングルクオート)とは全然意味が違うのでご注意ください。

さて、それを踏まえて、上のコマンドの、バッククオートの部分に注目します。

このぶぶんは、grepコマンドで、/var/log/mysqld.log ファイルの中の 「temporary password」という文字列を検索して、該当する一文を返答します。|(パイプ)でawk に渡されていますが、awkはプログラム言語のひとつで、文字列の処理を簡単な記述で行うことができます。

AWKの説明

awk に文字列が渡されると、awkは一行単位で処理します。特に指定をしなければ、スペース(空白)文字によって文字列が分けられます。この分けたものをフィールドと言います。

NFというのはその行のフィールドの数を示す変数になってます。

そして、printf $数字 というコマンドは、数字番目のフィールドを表示する命令となってます。$1 であれば、1番目、$3であれば3番目のフィールドの文字列です。

例えば、grepコマンドでは、次の一行がawkに渡されます。

上の文字列がawkに渡されると、まず、スペース文字でフィールドに分けられますので、例えば awk {printf $3} とやると、3番目のフィールドの [Note]  が出力されます。NFという変数にはフィールドの数が入っているため、 awk {printf $NF}  では、最後のフィールドが表示されます。

なので、

が渡されたときは、root の初期パスワード VIj4=.fYuxxx が表示されるんです。

シェルコマンドのバッククオートの箇所にこのパスワードを代入すると、

は、

となり、 mysqladmin コマンドを ユーザ名=root、パスワード=初期パスワードで実行し、パスワードを 12345aA! に変更しています。

htmlファイル

これらは、バーチャルホストの動作確認のためのブラウザでアクセスする用のファイルとなります。

http://test.lhost/ アクセス用

phpコードにより、$_SERVER 変数に入っている連想配列の中を表示させています。
いろいろとサーバーの情報が垂れ流しになるので、公開サーバーで公開しないように注意してくださいね。

http://vagrant.lhost/ アクセス用

こっちは、公開しても害はありません。

表示されるたびに、サーバー側で 1~100の間の乱数を発生させ、結果を表示するテストページとなってます。1,2が出た時は、大当たりとして表示内容を変えてます。

動作確認結果

説明したファイル一式で実際に自動構築した結果を載せておきます。

自動構築のログ

いったん、仮想マシンを削除して、再度作ってみました。10分ぐらいで構築できています。

ログを載せます。

動作確認

ブラウザでのアクセス確認
phpMyAdmin

ホストOS(Windows10)のブラウザで http://192.168.33.10/phpMyAdmin でアクセスします。

root, 設定後の初期パスワード 12345aA! でアクセスしてみます。

ログインして、「データベース」一覧を見てみましょう。

test_dbというデータベースを作成してみます。

test_dbと入力して「作成」ボタンをクリックします。

ついでにテーブルも作成しましょう。名前に「test_tbl」カラム数は1にして「実行」ボタンを押します。

適当に、カラム名にc1 と入れて「保存する」をクリックします。

テーブルが作成できました。

テーブルの照合順序が utf8mb4_bin  になっていれば、とりあえず、apache、php、mysqlのインストールは全て問題ないでしょう。

データベースを消しておきます。

「サーバ:localhost」をクリックして、さらに「データベース」をクリックすると、データベース一覧が表示されます。

test_dbのチェックボックスにチェックを入れて、「削除」リンクをクリックしましょう。

確認ウィンドウで「OK」で確定します。

デフォルトサーバ

http://192.168.33.10/にアクセスします。

「Testing 123..」のページが表示されればデフォルトサーバーの表示はOKです。

test.lhost 表示

http://test.lhost/ にアクセスして下さい。

下図のように環境変数一覧が表示されれば、ちゃんと表示がホスト名によって切り替わってます。ホストOS(Windows10)の hosts ファイルが設定されていなかったら、サーバーが見つからないエラーになります。その時は、記事「windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その2)IPアドレスとホスト名の設定」のhostsファイルの設定をチェックしてみてください。

vagrant.lhost 表示

ここまでくれば、ブラウザ系はまず大丈夫ですが、vagrant.lhostの方も確認しておきましょう。

http://vagrant.lhost/ にアクセスして下さい。

下図の感じで、抽選結果が表示されればOKです。

SSHでのログインしてのテスト

sshでログインして、日本語表示とタイムゾーンの確認をしましょう。

とコマンド入力して、SSHでログインしましょう。

もし、下リストのように、 Host key verification failed.  と出ている場合、同じIPアドレスで仮想マシンのキーが変わってしまってます。今回のように、vagrant destroyしてupするなど、仮想マシンを再構築しているとこういうことが起きます。

こういう時は、ホストマシン(windows10)に保存されているキーを削除してしまいましょう。SSHの接続先のコンピュータに変更がないはずなのに、こういうエラーが出た場合、偽物のコンピュータが成りすましている可能性がありますので、接続先の情報を得るなどして、接続先が安全か確認する様にしてください。

ここでは、Git bash 上で .ssh/known_hosts ファイルを編集して、192.168.33.10 の行を削除してます。

コマンドで削除することもできます。

ssh-keygen -R 192.168.33.10 と入力することで、ファイルからIPアドレス 192.168.33.10 のコンピュータのキー情報を削除することができます。

さて、この状態で改めて ssh vagrant@192.168.33.10 とすると、ユーザvagrant で仮想マシンにログインすることができます。

初めての接続となりますので、「Are you sure you want to continue connecting?(継続するか)」と聞かれたら、「yes」+リターンキーで答えてください。

vagrant のパスワードは vagrant です。(ついでにrootのパスワードも)。

ログインできたら、 date コマンドを入力しましょう。

下リストのように、日本語表示されていて、さらに「JST」と日本標準時になっていればOKです。

確認は以上でOKとなります。ログアウトして終了です。exit と入力するか、Ctrlキー+d でログアウトできます。

まとめ

この記事では、Itamaeを使って CentOS7/Apache2.4/MySQL5.7/PHP7.1 を自動で構築するための方法を説明しました。

バージョンアップやレポジトリのURL変更など、この記事の通りでできないことも出てくるかもしれませんが、この記事に書いてある設定の理由を理解することができれば、自分で情報を得て、修正することが可能だと思います。

また、ほかにも環境を変更する際には、仮想マシンにログインして変更するだけでなく、その都度、Itamaeのファイルにも反映することにより、いつでも、環境を再構築することができます。

普段楽をするため、また、いざというとき、すぐに再構築できるためにも、ぜひ、自動構築にチャレンジしてみてください。

再構築は忘れたころにやってきますよ。

windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その1)仮想マシン作成まで

windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その2)IPアドレスとホスト名の設定

windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その3)LAMP環境構築の概略

windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その4)手作業でLAMP環境構築

windowsにvagrantとvirtualboxでWeb開発環境をつくろう。(その5)itamaeを使って自動でLAMP環境構築するには

この記事が気に入ったら
いいね ! しよう