Ansible でインストール (php 5.6)

php 5.6 を Ansible の Playbook を用いてインストールしてみたので、その備忘録を。

インストールは yum からのインストール + 設定ファイルの編集だけなので、Playbook も簡単に記述することが出来ます。
Apache の投稿をしたので今回はそちらも合わせて参照してください。

[Ansible でインストール (Apache 2.2)](http://qiita.com/KisaragiZin/items/7ef56668fab8e7943658)
[Ansible でインストール (Apache 2.4)](http://qiita.com/KisaragiZin/items/02465058e3b930cc094e)

今回は Apache 2.2 / php 5.6 の組み合わせでインストールします。

## 環境

* CentOS 6.7
* ansible 2.0

※開発環境利用の為、iptables / SELinux については事前に無効化しております。
※yum で "Developer tools" グループを インストールし、必要なコマンドは適宜導入しています。

## Playbook の記述

Playbook は Role 構造で記述します。
Role 作成方法については [こちら](http://qiita.com/KisaragiZin/items/02465058e3b930cc094e) を参照してください。

構成は以下の通りです。

```bash:
.
├── group_vars
│   └── webservers                    # 各タスクで使用する変数定義
├── hosts
├── roles
│   └── web
│       ├── handlers
│       │   └── main.yml              # httpd handler の定義
│       └── tasks
│           ├── main.yml              # 各インストール yaml の呼び出し
│           ├── install_apr.yml       # apr-devel インストール
│           ├── install_apr_util.yml  # apr-util-devel インストール
│           ├── install_distcache.yml # distcache インストール
│           ├── install_httpd_2_2.yml # httpd インストール
│           └── install_php_5_6.yml   # php インストール
└── webservers.yml
```

以下のファイルについては Apache の投稿を参照してください。

* group_vars/webservers
* handlers/main.yml
* tasks/install_apr.yml
* tasks/install_apr_util.yml
* tasks/install_apr_distcache.yml
* tasks/install_httpd_2_2.yml

**hosts**

インストール対象ホストの設定です。
今回は localhost (実行サーバ自身) です。

```ini:hosts
[webservers]
localhost
```

**webservers.yml**

メイン Playbook です。
対象の web Role との関連付けを行っています。

```yaml:webservers.yml
---

- name: install and configure the web
  hosts: webservers
  remote_user: root

  roles:
    - web
```

**group_vars/webservers**

各タスクで使用する変数を定義しています。
定義内容はコメントを参照してください。
Apache の設定内容に以下を追記する形となります。

```yaml:group_vars/webservers
# webservers Variables

・・・
中略
・・・

php_5_6:
  # php 提供元レポジトリURL
  repo_url: http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
  # 利用レポジトリ
  enablerepo: remi-php56
  # インストール対象パッケージ
  install_packages:
    - php
    - php-cli
    - php-common
    - php-dbg
    - php-devel
    - php-gd
    - php-mbstring
    - php-mcrypt
    - php-mysqlnd
    - php-opcache
    - php-xml
  # httpd 用 php 設定ファイル(原本)
  httpd_config_org_path: /etc/httpd/conf.d/php.conf
  # httpd 用 php 設定ファイル
  httpd_config_path: /etc/httpd/conf/extra/httpd-php.conf
  # httpd 用 php追加読み込み文言
  httpd_config_include_php: 'Include conf/extra/httpd-php.conf'
  # php 設定ファイル
  config_path: /etc/php.ini
  # php 設定ファイル変更箇所
  config_changes:
    - regexp: '^;(date.timezone) =.*'
      line: '\1 = Asia/Tokyo'
    - regexp: '^;(mbstring.language) =.*'
      line: '\1 = Japanese'
    - regexp: '^;(mbstring.internal_encoding) =.*'
      line: '\1 = UTF-8'
    - regexp: '^;(mbstring.http_input) =.*'
      line: '\1 = pass'
    - regexp: '^;(mbstring.http_output) =.*'
      line: '\1 = pass'
    - regexp: '^;(mbstring.encoding_translation) =.*'
      line: '\1 = off'
```


**tasks/main.yml**

main.yml では各タスクの読み込みを行っています。
タスクの詳細は各ファイルで記述しています。

```yaml:tasks/main.yml
---
- include: install_apr.yml
- include: install_apr_util.yml
- include: install_distcache.yml
- include: install_httpd_2_2.yml
- include: install_php_5_6.yml
```

**install_php_5_6.yml**

php のインストール Playbook です。
インストール対象のパッケージは上記の変数定義ファイルで定義済みなのでこちらは簡潔に記述することが出来ます。
また、php.ini 内の変更箇所も変数定義ファイルに配列として定義しています。

```yaml:install_php_5_6.yml
---
# build and install php_5.6

- name: remi レポジトリのインストール
  yum:
    name: "{{ php_5_6.repo_url }}"
    state: present

- name: php のインストール
  yum:
    name: "{{ php_5_6.install_packages }}"
    enablerepo: "{{ php_5_6.enablerepo }}"
    state: present

- name: httpd 用 php 設定ファイルの配置
  shell: "mv {{ php_5_6.httpd_config_org_path }} {{ php_5_6.httpd_config_path }}"
  args:
    creates: "{{ php_5_6.httpd_config_path }}"

- name: php 設定ファイル編集
  lineinfile:
    dest: "{{ php_5_6.config_path }}"
    backrefs: yes
    regexp: '{{ item.regexp}}'
    line: '{{ item.line }}'
  with_items: "{{ php_5_6.config_changes }}"

- name: httpd 用 php 追加読み込み設定追記
  lineinfile:
    dest: "{{ apache_2_2.conf_file}}"
    line: "{{ php_5_6.httpd_config_include_php }}"
  notify: restart httpd

- name: php用 sample ファイル配置
  shell: "echo '<?php phpinfo() ?>' > /var/www/html/info.php"
  args:
    creates: "/var/www/html/info.php"
```

sample ファイルに php の状態を出力するスクリプトを記述しております。
インストールの確認がとれましたら削除してください。

以上、タスクの記述となります。

## Playbook の実行

作成した Playbook を実行しましょう。

```bash:
$ ansible-playbook -i hosts webservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=39   changed=33   unreachable=0    failed=0
# 確認の為、再実行
$ ansible-playbook -i hosts webservers.yml
・・・
PLAY RECAP *********************************************************************
localhost                  : ok=38   changed=0    unreachable=0    failed=0
```

正常に実行されたでしょうか。
実行後、`http://サーバのIPアドレス または、ホスト名/info.php` にアクセスすると、phpinfo の結果が出力されます。

![phpinfo.jpg](https://qiita-image-store.s3.amazonaws.com/0/49473/8877d9d3-47d4-49d3-5538-23b518a4f1ec.jpeg)


Apache + PHP は Web アプリケーションとしてよくある組み合わせかと思うので、利用頻度は高いと思います。
また、Apache + PHP が要件となるミドルウェアも多いかと思います。