#FJMK blog

citrus+というバンドをやってます。 http://citrusplus.jp 平日昼間はインターネットの会社@紀尾井町でエンジニアやってます。

AnsibleでLinux × nginx × MySQL × PHP × WordPress環境を構築してみた

f:id:sfjmk:20170903160059j:plain ブログは以前はてなブログで書いていたのですが、前回の更新からだいぶ日が空いてしまったので、年が変わる前に心機一転新しいブログをWordPressで作ってみました。 WordPressテーマはとりあえずSimplicityをそのまま使ってるので殺風景ですが、気が向いたらかっこ良くしたり細かい設定をいじったりしていきたいと思います笑

久しぶりなのでなかなか筆が進みませんが、徐々に慣れていければなと。

以前のブログはこちら (といってもそんなに記事ないですが…)

fjmk blog

都内の大学生エンジニアのブログ。プログラミングのことや日々感じていることを書いていきます。

今回ブログを作るにあたって、Ansibleを初めて使って環境構築をしたので、まずはその方法を書いてみます。

サーバーはカゴヤVPSを借りました。

VPS(仮想専用サーバー)|カゴヤ・クラウド/VPS|レンタルサーバーのカゴヤ・ジャパン

「カゴヤクラウドVPS」は、日額31円〜、月額864円〜のお手軽な価格で高性能・セキュリティも万全です。「Open VZ」を最の利点大限に活用した軽快な仮想専用サーバーです。

これまでさくらVPSを3年くらい契約してたのですが、

  • 料金に対してのスペックがそんなに変わらない
  • スケールアップが簡単にできる
  • 利用料が日割り計算(重要!)

という理由でカゴヤに乗り換えました。

一応アプリケーションパックというものが用意されていて、WordPress環境はクリックだけで作れるようになっているのですが、1つのサーバーに他のWebアプリケーションも載せたかったので、ちゃんと環境を把握できるようAnsibleを使ってみることにしました。

今回作ったファイルはGitHubに置きました。 https://github.com/sfujimaki/ansible-playbooks

sfujimaki/ansible-playbooks

Contribute to ansible-playbooks development by creating an account on GitHub.

Ansibleとは?

ここまで読んでいる方は恐らくご存知かとは思いますが、最近(でもないか)流行りの構成管理ツールです。 この記事では説明を割愛しますが、この辺とかを見ておくと概要が分かるんじゃないでしょうか。

Ansible 入門 - Qiita

Ansible 入門 社内勉強会で Ansible の初歩的な発表をしたのでその資料を公開します。 間違い等あるとおもいますが、指摘して頂ければ幸いです。 Ansible とは? 構成管理ツールです。Chef とか Puppet とかああいうののお仲間です。 Puppet は知りませんが、Chef は少し使って嫌気が差して止めました。 理由は 特殊なことをしようとすると Ruby の知識が必要になる 構成管理「される側」にも Chef が必要(エージェント...

エージェントレスでシンプルな構成管理ツール「Ansible」入門

近年、ChefやPuppetなどの構成管理ツールが人気だが、新たに注目されつつある構成管理ツールとして「Ansible」がある。Ansibleは設定ファイルがシンプルで、管理対象サーバーに特別なソフトウェアをインストールすることなく利用できるなど、最小限の手間で各種設定を自動化できるのが特徴だ。今回はこのAnsibleについてその基本的な使い方を紹介する。

LEMP環境構築方法

Linux × Apache × MySQL × PHPを使う時はLAMP環境だけどNginxの場合なんて略すんだろうと思ってたら、どうやらLEMPというようです。 LEMP - Google 検索

このVPSRails等のアプリケーションを載せたかったというのもあり(別にApacheでもできますが笑)、Webサーバソフトは何となくNginxを使おうと思いました。 ただ、途中で気づいたのですがWordPressにはApacheを使うのが一般的のようで、WordPress×Apacheの記事数に比べるとWordPress×Nginxの記事はかなり少なかったので特にこだわりがなければApacheがいいかも…

nginx×wordpressの構築方法はブログ等に幾つか上がっていますが、Ansibleの公式リポジトリにもサンプルが上がっているので、こちらをベースに作りました。

ansible/ansible-examples

ansible-examples - A few starter examples of ansible playbooks, to show features and how they work together. See http://galaxy.ansible.com for example roles from the Ansible community for deploying many popular applications.

また、公式のベストプラクティスはこんな感じみたいです(今回は少し崩しています)

Best Practices - Ansible Documentation

Here are some tips for making the most of Ansible and Ansible playbooks. You can find some example playbooks illustrating these best practices in our ansible-examples repository. (NOTE: These may not use all of the features in the latest release, but are still an excellent reference!).

他にも幾つか參考にしたページがあるので、そちらは記事の最後に追記します。

本来であればベストプラクティスのように要素ごとにRoleを分けるべきですが、今回は見通しを良くするためにRoleは分けずに作りました。 また、多くのサンプルではルートディレクトリにWordPressをインストールしていますが、今回はWordPressを専用ディレクトリ(今回の場合は/wpディレクトリ)に配置したかったので、その前提で作っています。

WordPress を専用ディレクトリに配置する - WordPress Codex 日本語版

Nginxの設定等は、サンプルや他の解説記事と異なってると思うのでご注意ください。

一通り触った今となってはRoleを分けたほうが分かりやすいですが、最初は全容が把握しづらかったので1ファイルにまとめたほうが分かりやすかったです。 また、備忘録も兼ねてコード内にコメントも書いておきました。

ディレクトリ(playbook)は以下の2つに分けました。

  • setup ・・・ ユーザー作成,ssh設定,ポート設定等、サーバー立ち上げ時に必要な設定
  • wordpress-nginx ・・・PHP, Nginx, MySQL, WordPressのインストール&各種設定

内容については以下で説明していきます。

setup

こちらのplaybookでは、

  • ユーザー作成
  • ssh設定
  • ポート設定

といった、サーバーを立てたら最初にするべきことを実施します。

ポート等の設定とWordPressインストール等を一気にやろうとすると、ポート設定タスク実行後に接続が切れてしまうので、playbookを分けました。

ファイル構造はこのようになっています。

 $ tree ./setup
 ./setup
 ├── group_vars
 │   └── all
 ├── hosts
 ├── roles
 │   └── setup
 │   ├── files
 │   │   ├── authorized_keys_for_admin
 │   │   └── authorized_keys_for_fujimaki
 │   ├── handlers
 │   │   └── main.yml
 │   ├── tasks
 │   │   └── main.yml
 │   └── templates
 │   └── iptables
 └── site.yml

環境に依存するファイルはgithubでは.exampleをつけていますが、使用時は外してよしなに設定してください。

ベストプラクティスに沿うとすればrolesが

みたいになるところを、setup roleにまとめているという感じです。

taskはこちら。 https://github.com/sfujimaki/ansible-playbooks/blob/master/setup/roles/setup/tasks/main.yml

hostsは

と設定して以下のようにコマンドを実行します。 $ ansible-playbook -i setup/hosts setup/site.yml -u root --private-key=~/.ssh/kagoya_vps_key_01.key (~/.ssh/kagoya_vps_key_01.keyはサーバーに登録した秘密鍵のパス) 検証したのはカゴヤVPSだけですが、以下のように実行すれば ユーザーが追加され、sshもできるようになり、10022ポートだけが開かれた環境ができるはずです。(どのポートを開くかはgroup_vars/all で定義)

wordpress-nginx

続いては、WordPressが動く環境を作るplaybookです。

こちらのファイル構成はこんな感じです。

 $ tree ./wordpress-nginx
 ./wordpress-nginx
 ├── group_vars
 │   └── all
 ├── hosts
 ├── roles
 │   └── wordpress-nginx
 │   ├── handlers
 │   │   └── main.yml
 │   ├── tasks
 │   │   └── main.yml
 │   └── templates
 │   ├── my.cnf
 │   ├── nginx-wordpress.conf
 │   ├── php-fpm-wordpress.conf
 │   └── wp-config.php
 └── site.yml

サンプルと比べるとだいぶシンプルになったんじゃないでしょうか。(その後の管理を考えるとrole分けるのが理想ですが)

こちらでもtaskを貼っておきます。 https://github.com/sfujimaki/ansible-playbooks/blob/master/wordpress-nginx/roles/wordpress-nginx/tasks/main.yml

Ansibleのリポジトリにあるコードだと、SELinux が有効でないとエラーになってしまうので、こちらにあるコードを足しています。 Ansibleで WordPress日本語版(3.9.1) を楽々インストール - akiyoko blog

hostsは以下のようにsetupで設定したものに開放ポートを追記した上で、

以下のコマンドを実行します。

$ ansible-playbook -i wordpress-nginx/hosts wordpress-nginx/site.yml

これでWordPressが動く状態になるはずです。

WordPress設定

最後に、ディレクトリを変更します。 http://example.com/wp にアクセスして管理画面にログインし、設定 → 一般 で 「サイトアドレス」から “/wp” を消し、「変更を保存」を押すと完成です!

まとめ

途中から面倒臭くなって説明不足な感が否めませんがお許しください笑

簡単にできると思ってたら、ちょっと設定を変えたりしたせいで地味に面倒でした… ベストプラクティスに沿ってしっかり構築するのも良いですが、ファイルが多くなって最初はとっつきにくいので1ファイルにまとめて見るのも良いんじゃないでしょうか。

ここまで書いといてという感じではありますが、1環境に対して1アプリケーションもしくは1アプリケーションを複数サーバーに置くという運用なら便利ではあるものの、個人の半分実験用途のサーバーならわざわざ面倒な構成管理をしなくてもいいのかなーと思いました笑

手順書のコード化という意味では有用だと思うので、手動で環境構築した上で、Ansibleにコードとして残すという使い方が良いかもしれません。

參考にしたページ