redmine-centos-ansible でリモートインストール

## 概要
Redmine をインストールする手順が意外と煩雑で、playbook を作ろうか・・・と思っていたが、
[日本語情報サイト](http://blog.redmine.jp/articles/3_2/install/centos/)に、playbook のリンクが公開されていたので、これを利用してインストールした。
しかし、localhost へのインストールは手順通りで完了したが、リモートサーバーへのインストールでは幾つかつまづいたので、その情報をまとめる。

## やりたかったこと
概要に記載の通りだが、開発マシンの ansible コマンドで、サーバーに対して Redmine のインストールがしたかった。

### 環境情報
* 開発マシン：Mac(ansible 2.0.0.2）  
基本的にここからサーバーに向かってansibleコマンドを実行する
* サーバー　：CentOS7(Vagrant)  
Redmineをインストールするサーバー。今回はテスト用に Vagrant で CentOS7 を動かしている

## トピックス
* proxy設定は https:// 使用禁止！！
* subversion モジュールを利用し、リモートサーバーへインストールするときは、`environment`で言語設定をしてあげるのを忘れずに！！

## ざっくり手順
1. ひとまず、Mac に playbook を clone してくる
2. `/group_vars/redmine-servers` の PostgreSQL パスワードを適宜変更する
3. `hosts` ファイルをサーバーの IP またはホスト名に変更する
4. コマンドを実行する(`ansible-playbook -i hosts site.yml`)

基本的に手順はこれだけだが、ここでエラーが発生した。

## 調査内容と結果
### エラー１：パーミッションエラー
最初に出たエラーは以下。
出力内容の通り、pg_hba.conf が存在しないらしい。
`vagrant ssh` で確認すると、確かにファイルが存在しない。

```sh
TASK [pg : pg_hba.confにredmine用設定が存在するか確認] *************************************
fatal: [10.0.0.6]: FAILED! => {"changed": false, "cmd": ["grep", "redmine", "/var/lib/pgsql/data/pg_hba.conf"], "delta": "0:00:00.003211", "end": "2016-04-05 15:48:20.132030", "failed": true, "failed_when_result": true, "rc": 2, "start": "2016-04-05 15:48:20.128819", "stderr": "grep: /var/lib/pgsql/data/pg_hba.conf: そのようなファイルやディレクトリはありません", "stdout": "", "stdout_lines": [], "warnings": []}
```

原因を調査するため、`-vv`オプションを追加して再度実行。

```sh
$ ansible-playbook -i hosts site.yml -vv
## 省略 ##
TASK [pg : PostgreSQL initdb] **************************************************
ok: [10.0.0.6] => {"changed": false, "cmd": ["postgresql-setup", "initdb"], "delta": "0:00:00.020853", "end": "2016-04-05 15:50:49.701452", "failed": false, "failed_when_result": false, "rc": 1, "start": "2016-04-05 15:50:49.680599", "stderr": "mkdir: ディレクトリ `/var/lib/pgsql/data' を作成できません: 許可がありません", "stdout": "Initializing database ... failed, see /var/lib/pgsql/initdb.log", "stdout_lines": ["Initializing database ... failed, see /var/lib/pgsql/initdb.log"], "warnings": []}

TASK [pg : pg_hba.confにredmine用設定が存在するか確認] *************************************
fatal: [10.0.0.6]: FAILED! => {"changed": false, "cmd": ["grep", "redmine", "/var/lib/pgsql/data/pg_hba.conf"], "delta": "0:00:00.003316", "end": "2016-04-05 15:50:50.138371", "failed": true, "failed_when_result": true, "rc": 2, "start": "2016-04-05 15:50:50.135055", "stderr": "grep: /var/lib/pgsql/data/pg_hba.conf: そのようなファイルやディレクトリはありません", "stdout": "", "stdout_lines": [], "warnings": []}
```

initdb の時点で、ディレクトリ作成権限がなくてエラーになっている。
どうやら become 設定がないようなので、`-b`オプションを追加して、再度実行する。

```sh
$ ansible-playbook -i hosts -b site.yml -vv
### 省略 ###
TASK [pg : pg_hba.confにredmine用設定が存在するか確認] *************************************
ok: [10.0.0.6] => {"changed": false, "cmd": ["grep", "redmine", "/var/lib/pgsql/data/pg_hba.conf"], "delta": "0:00:00.002854", "end": "2016-04-05 15:52:10.643204", "failed": false, "failed_when_result": false, "rc": 1, "start": "2016-04-05 15:52:10.640350", "stderr": "", "stdout": "", "stdout_lines": [], "warnings": []}

TASK [pg : pg_hba.conf設定変更用パッチを配置] *********************************************
changed: [10.0.0.6] => {"changed": true, "checksum": "347dddfacf1756c586873f137a5fab152b3dd252", "dest": "/tmp/redmine-setup/pg_hba_conf.patch", "gid": 0, "group": "root", "md5sum": "05ff2528ef0436be8db9eb3e4612b669", "mode": "0644", "owner": "root", "secontext": "unconfined_u:object_r:user_home_t:s0", "size": 472, "src": "/home/vagrant/.ansible/tmp/ansible-tmp-1459839211.11-100982561681718/source", "state": "file", "uid": 0}

### 省略 ###
```

最初のエラーは出なくなった。けど、この後にまたエラーが発生したので次項へ・・・。

### エラー２：Proxy エラー
エラー内容は以下。
ansible は、https のプロキシに対応していないよ、というエラー。

```sh
TASK [ruby : Rubyのソースコードのダウンロード] ***********************************************
fatal: [10.0.0.6]: FAILED! => {"changed": false, "failed": true, "msg": "Unsupported proxy scheme: https. Currently ansible only supports HTTP proxies."}
```

社外と通信するために、`/etc/environment`に Proxy 設定をしているが、この中のプロキシサーバーのURLのうち、https:// から始まっているものを、http:// に変更して、再度実行する。

### エラー３：svn checkout 失敗エラー
また少し進んだけど、今度は Redmine のソースをチェックアウトする処理で失敗。
ここは解決までかなりハマった。。。

```sh
$ ansible-playbook -i hosts -b site.ml
### 省略 ###
TASK [ruby : Rubyのソースコードのダウンロード] ***********************************************
skipping: [10.0.0.6]

TASK [ruby : Rubyのソースコードを展開] ***************************************************
skipping: [10.0.0.6]

### 省略 ###

TASK [redmine : Redmineのソースコードをチェックアウト] ****************************************
fatal: [10.0.0.6]: FAILED! => {"changed": false, "failed": true, "module_stderr": "", "module_stdout": "Traceback (most recent call last):\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1459840124.42-149142757013995/subversion\", line 2194, in <module>\r\n    main()\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1459840124.42-149142757013995/subversion\", line 239, in main\r\n    before = svn.get_revision()\r\n  File \"/home/vagrant/.ansible/tmp/ansible-tmp-1459840124.42-149142757013995/subversion\", line 167, in get_revision\r\n    rev = re.search(r'^Revision:.*$', text, re.MULTILINE).group(0)\r\nAttributeError: 'NoneType' object has no attribute 'group'\r\n", "msg": "MODULE FAILURE", "parsed": false}
```

ansible の subversion モジュールでチェックアウトする際、リポジトリの情報を取得する処理が入っており、この時内部的には`svn info`し、出力結果から`Revision:`で始まる行を検索している。

subversion モジュール内で`os.environ['LANG'] = 'C'`としているので、OS の言語設定に依存せず英語で情報が取得できるようになっているのだが、どうやらこれは hosts が localhost の場合しか正しく設定できない模様（ansible が動いているマシンのLANGだけ設定される？）

今回のように、hosts にリモートサーバーを指定している場合、日本語で情報が取得されており、`リビジョン`のようになっているために、正しく情報取得できなかった模様。

致し方ないので、コマンド実行前に`LANG=C`を付与して実行。

```sh
$ LANG=C ansible-playbook -i hosts -b site.ml
### 省略 ###
TASK [??] **********************************************************************
ok: [10.0.0.6] => {
    "msg": "?????????????? http://10.0.2.15/redmine/ ????????????"
}

PLAY RECAP *********************************************************************
10.0.0.6                   : ok=43   changed=21   unreachable=0    failed=0   
```

一応、成功したが、日本語が正しく表示されず、何が何だかわからない。。。
さすがにこれでは失敗した時不便なので、playbook 内の`roles/redmine/tasks/main.yml`に少し追記して再度実行。

```yaml:main.yml（抜粋）
- name: Redmineのソースコードをチェックアウト
  sudo: yes
  subversion:
    repo={{ redmine_svn_url }}
    dest={{ redmine_dir }}
  ### 以下３行追記 ###
  environment:
    LANG: "C"
    LC_ALL: "C"
```

```sh
TASK [apache : httpdの再起動] ******************************************************
changed: [10.0.0.6]

TASK [完了] **********************************************************************
ok: [10.0.0.6] => {
    "msg": "インストールが完了しました。 http://10.0.2.15/redmine/ にアクセスしてください。"
}

PLAY RECAP *********************************************************************
10.0.0.6                   : ok=50   changed=39   unreachable=0    failed=0   
```