バカンス駆動開発

この前バカンスって言ったら「古っ」って言われました

Ansible+Vagrant(ansible_localプロビジョナ)でPHPのローカル開発環境を作る

注意

この記事ではVagrant1.8から導入されたansible_localプロビジョナを使用していますが、現在インストールされるansibleのバージョンが上がってしまいVagrant側がまだそれに対応していません。 issueにも上がっていますので近々対応されるかも・・?

github.com

なので現状うごきません・・!

進展があったら追記していきます。

追記(2016/06/18)

追記時点でVagrantのバージョン1.8.4が公開されており、このバージョンでは上記の不具合は解消されております。

使い方

github.com

git clone git@github.com:egapool/centos66-ansible.git
cd centos66-ansible
vi Vagrantfile // プライベートIPとsynced_folderを各自の環境に合わせて編集

vhosts.confに記載する内容のベースとなる情報(ドメインとパブリックディレクトリのパス)を予め与えると自動でvhostsに記述されます。 下の例のようにapache_vhosts_sslに記載するとSSL自己証明書の自動生成も行います。

(略)
- role: apache
      apache_vhosts:
        - {servername: "local.example.com", documentroot: "/var/www/html/example/public"}
      apache_vhosts_ssl:
        - {servername: "local.sslexample.com", documentroot: "/var/www/html/sslexample/public"}

(略)

準備が整ったら

vagrant up

基本的にはvagrant upするだけですむようにしています。
デフォルトで以下の構成が構築されます。

Ansible

Ansibleとは構成管理ツールの一つです。類似のツールにchef,puppetなどがあります。構成管理ツールとはサーバーにインストールするミドルウェアや設定ファイルの内容などをテキスト(Ansibleではplaybookと呼びます)に書き起こし、それを元に状態を再現することを簡単にするためのツールです。これによって、大規模なサーバー管理が簡単になったり、サーバーに入り内容を確認しなくてもどんな状態かわかるなどのメリットがあります。

必要なもの

Ansibleを使用するにあたってローカルPC(ホスト側)にはVagrant以外なにも必要ありません。Ansibleすらインストールする必要がありません(後述します)。

事前知識

Ansibleの基本はこのチュートリアルをこなせば一通り学べると思います。1時間もかかりませんのでこれからAnsibleをやってみたいという方は是非チャレンジしてみてください。

Ansible チュートリアル | Ansible Tutorial in Japanese

こちらの書籍はAnsibleを使う上で必要十分な知識が載っています。値段もお買い得なのでおすすめです。

Amazon.co.jp: 入門Ansible eBook: 若山史郎: Kindleストア

また、playbookはYAMLで書きます。YAMLの文法はとても簡単なので一瞬で習得できます。こちらをオススメします。

Rubyist Magazine - プログラマーのための YAML 入門 (初級編)

ansible_localプロビジョナについて

Vagrant1.8からansible_localプロビジョナが追加されました。このプロビジョナを使うと、ゲストOSの方にansibleをインストールさせてから、ゲストOSがローカルに対してplaybookを実行します。今回はこれを使います。

roleついて

roleとはミドルウェアをインストールするひとまとまりの単位です。例えば「httpdのrole」や「phpのrole」など。一つのrole内でソフトウェアのインストールから設定ファイルの編集、再起動などを行わせます。roleはそれぞれ独立しています。

roleのディレクトリ配置(apacheの例)

└apache/
    ├ defaults/   # roleで使う変数のデフォルト設定を置くディレクトリ
    │  └ main.yml
    ├ handlers/   # ハンドラータスクを置くディレクトリ
    │  └ main.yml
    ├ tasks/      # タスク用ディレクトリ。roleを実行するとこのmain.ymlが呼ばれる
    │  └ main.yml
    ├ templates/    # 設定ファイルなどのテンプレートを置くディレクトリ
    ├ meta/
    │  └ main.yml   # メタ情報を置くディレクトリ
    └ vars/
       └ main.yml     # 変数を置くディレクトリ

playbook全体のディレクトリ配置

playbook/
    ├ hosts   # インベントリファイル。今回はローカル開発環境ということでほぼ必要なし
    ├ site.yml # playbookの起点になる処理
    └ roles/ # 各roleを配置する
        ├ commaon/
        ├ repositries/
        ├ git/
        ├ apache/
        ├ phpenv/
        ├ mysql/
        └ redis/

site.ymlについて

---
- hosts: localhost  # hostsは何か指定しないといけない
  connection: local  # localに対してplaybookを実行させる
  become: yes  # コマンドをsudoユーザーで実行するかどうか

  roles:
    - role: common  # 各ロールディレクトリのtasks/main.ymlを実行する
    - role: repositries
    ・
    ・

apache

httpでもhttpsでもplaybook実行時にservernameとdocumentrootの組を配列で指定すると指定した分だけdocumentrootディレクトリの作成と対応するvhostの設定が記述されます。 また、httpsの場合はservernameごとに秘密鍵サーバ証明書を生成します。

SSLの仕組みと各種必要なファイルの説明はこのポストが詳しいです。
オレオレ証明書をopensslで作る(詳細版) - ろば電子が詰まっている

apacheロールでは以下のモジュールをepel-httpd24レポジトリを使ってインストール。

  1. httpd24-httpd
  2. httpd24-httpd-devel
    • httpdにDSOモジュールを追加するためにapxsなどが含まれているパッケージ
      • DSO(Dynamic Shared Object)とはhttpdに後から動的に追加できるモジュールのことです。httpd.confのLoadModuleディレクティブを用いて追加/削除を行えます。
      • apxsはDSOモジュールをインストールするためのツールです。
  3. httpd24-mod_ssl
    • opensslに対するインターフェース
  4. openssl

git

ソールからビルド。
git/defaults/mains.ymlでダウンロードするソースのバージョンを指定します。

phpenv

  • CHHを使用
  • php-fpmを使用
    • php-fpmはFastCGIリクエストに対応したインターフェースを持つPHP実装です(という理解で合ってるかな・・
  • PHPの各バージョンをビルドすると/tmp/php-build/source/5.6.xx/sapi/fpm/init.d.php-fpmに起動スクリプトが吐き出されるので/etc/init.d/へコピーして、そのあとchkconfigに登録します

mysql

repositries

各種リポジトリyumでインストールします。また、すべてのサードパーティリポジトリのenabledを0にします。

repositries roleはtask/main.yml以外使用しません。インストールするリポジトリを変数ファイルに切り出しても良いかなと思いましたがそんなにころころ変わるものでもないのでひとまずこれでいきます。