proxy 環境化の CentOS に Ansible で Redmine をインストール

# はじめに

[GitHub](https://github.com/) や、そのクローンである [GitLab](https://www.gitlab.com/), [GitBucket](https://github.com/takezoe/gitbucket) の話題を多く目にする昨今ですが、これらのツールは Pull Request による開発でこそ真価を発揮します。

一方で、Pull Request どころか git すら導入できていない現場もまだまだ数多くあるのが現状ではないでしょうか。

このような現場で課題管理をする際、選択肢のひとつとして [Redmine](http://redmine.jp/) が挙げられることがとても多いと思いますが、企業内 LAN に Redmine をインストールしようとすると、以下のようなトラブルに見舞われることが少なくありません。

- yum, wget, gem など、それぞれでプロキシサーバの設定が必要
- ruby をどのようにインストールすべきか判断が難しい
    - ruby を直接インストールするのか
    - rvm を使ってインストールするのか
    - rbenv を使ってインストールするのか
- どの HTTP サーバ / Rack サーバを採用すべきか判断が難しい
    - webrick を採用するのか
    - apache + passenger を採用するのか
    - nginx + unicorn を採用するのか

今回は Ansible を使って以下の構成で Redmine をインストールする手順を紹介します。

- rbenv 
- ruby 2.1
- Redmine 2.5
- apache + passenger


## 前提

プロキシサーバが存在する企業内 LAN で、以下の手順に従って仮想環境を構築しているものとします。

- [Vagrant と Ansible で Windows でも快適開発 - Qiita](http://qiita.com/garbagetown/items/d9a4eb64b778bd7d659c)

以下、上記手順に従って構築した仮想環境を作業マシン、redmine を構築する環境を対象マシンと呼びます。


## 手順

### 対象マシンの準備

まず対象マシンを用意します。ここでは Vagrant 上に仮想サーバとして作成しますが、すでに対象マシンが存在する場合、この手順は不要です。

適当な box をダウンロードしていない場合は、[Vagrant Base Box Downloads](http://nrel.github.io/vagrant-boxes/) などから box を選んでダウンロードします。

```bash
bash-3.1$ vagrant box add CentOS-6.3-x86_64-v20130101 http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
==> box: Adding box 'CentOS-6.3-x86_64-v20130101' (v0) for provider:
    box: Downloading: http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.3-x86_64-v20130101.box
[0m[0m Progress: 100% (Rate: 288k/s, Estimated time remaining: --:--:--)
==> box: Successfully added box 'CentOS-6.3-x86_64-v20130101' (v0) for 'virtualbox'!
```

続いて、適当なディレクトリを作成したら、移動して box を初期化します。

```bash
bash-3.1$ mkdir -p /c/vagrants/redmine
bash-3.1$ cd /c/vagrants/redmine/

bash-3.1$ vagrant box list
CentOS-6.3-x86_64-v20130101 (virtualbox)
precise64                   (virtualbox)

bash-3.1$ vagrant init CentOS-6.3-x86_64-v20130101
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.
```

作成された Vagrantfile を開いて IP アドレスを設定します。ここでは 192.168.33.100 としました。

```bash
bash-3.1$ vi Vagrantfile
bash-3.1$ grep private_network Vagrantfile
  config.vm.network "private_network", ip: "192.168.33.100"
```

最後に box を起動します。

```
bash-3.1$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS-6.3-x86_64-v20130101'...
==> default: Matching MAC address for NAT networking...
(snip)
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => C:/vagrants/redmine
```

### 鍵交換

作業マシンから対象マシンにパスフレーズなしでログインできるよう、作業マシンの公開鍵を対象マシンに登録します。teraterm などのターミナルから作業マシンにログインし、以下の作業を行います。

作業マシンでパスフレーズなしの公開鍵を作成していない場合は、以下のようにすべてデフォルトを受け入れて作成します。

```zsh
# vagrant at precise64 in ~ [14:29:46]
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/vagrant/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/vagrant/.ssh/id_rsa.
Your public key has been saved in /home/vagrant/.ssh/id_rsa.pub.
(snip)
```

作成した公開鍵を対象マシンの tmp ディレクトリに scp 転送します。`vagrant` ユーザのパスワードは `vagrant` です。

作業マシンのユーザと対象マシンのユーザが異なる場合は、`scp ~/.ssh/id_rsa.pub username@192.168.33.100` のように指定します。

```zsh
# vagrant at precise64 in ~ [11:33:27]
$ scp ~/.ssh/id_rsa.pub 192.168.33.100:/tmp
vagrant@192.168.33.100's password:
id_rsa.pub                                                                                                                                                 100%  399     0.4KB/s   00:00
```

続いて対象マシンに ssh ログインします。

```zsh
# vagrant at precise64 in ~ [11:33:46]
$ ssh 192.168.33.100
vagrant@192.168.33.100's password:
Welcome to your Vagrant-built virtual machine.
```

転送した公開鍵の内容を vagrant ユーザの authorized_keys に追記し、さらに root ユーザでログインした際にも適用されるよう、.ssh ディレクトリごと /root ディレクトリにコピーします。

```bash
[vagrant@localhost ~]$ cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys
[vagrant@localhost ~]$ sudo cp -r ~/.ssh/ /root/
```

設定が完了したら、不要な公開鍵を削除し、対象マシンからログアウトします。

```bash
[vagrant@localhost ~]$ rm /tmp/id_rsa.pub
[vagrant@localhost ~]$ logout
Connection to 192.168.33.100 closed.
```

### プロビジョニング

以下のようにして作業マシンに playbook を clone します。

```zsh
# vagrant at precise64 in ~ [15:02:25]
$ g clone https://github.com/garbagetown/ansible-redmine.git
Cloning into 'ansible-redmine'...
remote: Reusing existing pack: 159, done.
remote: Total 159 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (159/159), 14.35 KiB, done.
Resolving deltas: 100% (53/53), done.
```

clone したディレクトリに移動し、プロキシサーバの情報を設定します。`your.proxy.host` と `9999` は自身の環境に読み替えてください。

認証が必要な場合は `http://username:password@your.proxy.host:9999/` のように設定します。

```zsh
# vagrant at precise64 in ~ [15:03:18]
$ ansible-redmine

# vagrant at precise64 in ~/ansible-redmine on git:master o [15:04:12]
$ echo 'http_proxy: http://your.proxy.host:9999' >> roles/proxy/vars/main.yml
```

続いて、hosts ファイルの内容を確認します。対象マシンの IP アドレスと異なる場合は適宜修正してください。

```zsh
# vagrant at precise64 in ~/ansible-redmine on git:master x [15:04:28]
$ cat hosts
[redmine]
192.168.33.100
```

最後に playbook を実行します。マシンスペックや回線速度、rubygems.org の負荷状況にも依りますが、かなり時間が掛かるので注意してください。

```zsh
# vagrant at precise64 in ~/ansible-redmine on git:master x [15:21:22]
$ ansible-playbook -i hosts site.yml

PLAY [install git, subversion and redmine] ************************************

GATHERING FACTS ***************************************************************
ok: [192.168.33.100]
(snip)
NOTIFIED: [apache | restart iptables] *****************************************
changed: [192.168.33.100]

PLAY RECAP ********************************************************************
192.168.33.100             : ok=57   changed=51   unreachable=0    failed=0


# vagrant at precise64 in ~/ansible-redmine on git:master x [16:38:39]
```

## 確認

プロビジョニングが正常に完了したら、ブラウザから `192.168.33.100` にアクセスし、Redmine の画面が表示されることを確認します。

![20140403_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/6755/82704af6-6210-060d-1479-29873bbf3294.jpeg)

インストール後の初期設定などについては、[Redmineを使い始めるための初期設定 — Redmine.JP](http://redmine.jp/tech_note/first-step/admin/) を参考にしてください。


# まとめ

以上のように、とても簡単な手順でプロキシサーバの存在する企業 LAN 内に Redmine を構築することができました。

これまでは MS Office で作成したインストール手順書などでノウハウを共有することが多かったかと思いますが、人手で作業する以上、ミスをする可能性が常につきまといます。また、ミスをリカバリするために作業をくり返すと想定外の状態となり、ますますリカバリが困難になる場合も少なくありません。

Puppet や Chef, そして Ansible などのプロビジョニングツールを使うことで、これらの問題を解消することができます。

べき等性のある playbook を作ることはそれなりに手間ですが、今回紹介した Redmine のように、開発案件が立ち上がるたびに実施するような作業の場合、これらのツールを活用することで、いつでも、どこでも、誰でもミスなく実施できるということにはとても大きな価値があると思います。