複数環境のRedmine/RedMicaをアップデートする

<font color=red>2019/12/20　祝！Redmine4.1リリース！</font>

[Redmine Advent Calendar 2019](https://adventar.org/calendars/4221)の 24日用の記事です。
Redmineサーバの管理者のお役に立てれば幸いです。
※4.0→4.1へのアップデートに本記事では対応できませんので手動でお願いいたします。


# 背景・意図
AWS／社内／ローカルと全部で10台以上にRedmineを導入しています。
とにかく、Redmineもプラグインも最新リビジョンにしたい派なのですが、すべてを最新化するのはなかなかの手間。

ここまで増える前は各サーバにメンテナンス用のシェルスクリプトを置いていましたが、

- スクリプト改修時に全台に配置し直すのが面倒
- 環境によってRedmineのパスや導入プラグインが違って、微妙にシェルスクリプトを変更するのが面倒
- 複数のRedmineを１サーバに配置してる環境で実行する際にパスの書き換えで事故ったことも…

ということで、

- **環境依存の値を<font color=red>変数定義</font>**
- **変数を埋め込んだスクリプトを転送し、<font color="red">リモートで実行</font>**

という運用にするためのplaybookを作成しました。[^1]

https://github.com/ryouma-nagare/redmine-update.git

※シェルスクリプトを使用しないパターンも作成しました。
https://github.com/ryouma-nagare/redmine-update2.git
 

# 導入
※git/ansibleがインストール済みであることを前提とします。

## 1.リポジトリ取得

```shell
git clone https://github.com/ryouma-nagare/redmine-update.git
```

```file:初期ファイル一覧
redmine-update/
|-- README.md
|-- ansible.cfg
|-- host_vars
|   |-- host1
|   `-- host2
|-- inventory
|   `-- hosts
|-- keys
|   `-- your_key_file
|-- redmine-update.yml
`-- roles
    `-- redmine-update
        |-- handlers
        |   `-- main.yml
        |-- tasks
        |   `-- main.yml
        `-- templates
            `-- upd_redmine.sh.j2
```

## 2.inventory/hosts の編集
以下の書式で編集します。

```
[グループ名]
ホスト名 　ansible_host=ホスト情報　認証情報
```

今回はグループ `aws` ：鍵認証＊２台、グループ `intra` ：パスワード認証＊２台としました。

```file:hosts
[aws]
redmine-aws-1   ansible_host=i-XXXXXXXXXXXXXXXXX ansible_user=ec2-user ansible_private_key_file=./keys/aws.pem
redmine-aws-2   ansible_host=i-YYYYYYYYYYYYYYYYY ansible_user=ec2-user ansible_private_key_file=./keys/aws.pem

[intra]
redmine-intra-1 ansible_host=AAA.BBB.CCC.DDD ansible_user=USER1 ansible_password=PASSWORD1
redmine-intra-2 ansible_host=EEE.FFF.GGG.HHH ansible_user=USER2 ansible_password=PASSWORD2
```

※AWSは、[AWS Systems Manager Session Manager](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager.html) + [Session Manager Plugin](https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html)を使用して、ansible_host をインスタンスIDにしています。

## 3.keys/ に鍵ファイル配置

```
|-- keys
|   `-- aws.pem
```

※パスワードログインのみの場合は不要です。


## 4.host_vars/ に変数定義ファイル配置
`hosts` に記述したホスト名＝ファイル名として、`host1`、`host2`からリネームコピーしてください。

```
|-- host_vars
|   |-- redmine-aws-1
|   |-- redmine-aws-2
|   |-- redmine-intra-1
|   `-- redmine-intra-2
```
※パラメータ等の詳細はREADME.mdでご確認ください。

# 実行

```shell:全サーバ対象
ansible-playbook -i ./inventory/hosts redmine-update.yml
```

```shell:グループ指定で実行
ansible-playbook -i ./inventory/hosts redmine-update.yml -l aws
```

```shell:ホスト指定で実行
ansible-playbook -i ./inventory/hosts redmine-update.yml -l redmine-aws-1
```

基本的にはスクリプト実行後のサービス再起動がエラーにならなければ、アップデートに成功していると思いますが、不安なサーバは`debug_stdout`、`debud_stderr`を`true`にして、スクリプトの出力を確認してください。

## 実行例
```file:host_vars/redmine-aws-1
debug_stdout: false
debug_stderr: true
```
として、ホスト指定した結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63464/91524c73-0885-9562-f16e-a68af4f784f1.png)

※stderrが出力されていますがエラーが起きているわけではありません。


実際に使用する場合は、

- stdout/stderrを有効にした検証用のホストorグループに対して実行
- エラーにならなければ残りのグループごとに実行

とするのがよいかと思います。

## 明日はアドベントカレンダーの最終日
いよいよ、トリをつとめる [Maeda Go](https://twitter.com/g_maeda)さんです！


[^1]: redmine ディレクトリのオーナー／グループを apache:apache としているため、シェルスクリプト内で`sudo su -` に頼らざるをえず、パスワード無しのsudo設定が必要となっています…