Ansibleを使ってCentOS上にphp-mcryptをインストールしようとしたが、 "--check"オプションの挙動でハマった話

# 背景

1. [Ansible](https://www.ansible.com/) で検証環境では問題なく動作していたスクリプトが、本番環境適用直前に `--check` オプション( **dry-run** )付きで実行するとエラーが出る


# 環境

## OS

CentOS7

## Ansibleスクリプト

事象の再現のために簡単なAnsibleスクリプトを作成し調査

```yml
- hosts:
    - localhost
  tasks:
  - yum: name=epel-release state=latest

  - yum: name={{ item }} state=present
    with_items:
      - php
      - php-common
      - php-mcrypt
```

## 実行結果

```sh
[root@068a4db82a8f app]# ansible-playbook --check -i hosts php-mcrypt.yml
[DEPRECATION WARNING]: DEFAULT_SUDO_USER option, In favor of become which is a generic framework .
This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY [localhost] ***********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [localhost]

TASK [yum] *****************************************************************************************
changed: [localhost]

TASK [yum] *****************************************************************************************
failed: [localhost] (item=[u'php', u'php-common', u'php-mcrypt']) => {"changed": false, "item": ["php", "php-common", "php-mcrypt"], "msg": "No package matching 'php-mcrypt' found available, installed or updated", "rc": 126, "results": ["No package matching 'php-mcrypt' found available, installed or updated"]}
        to retry, use: --limit @/app/php-mcrypt.retry

PLAY RECAP *****************************************************************************************
localhost                  : ok=2    changed=1    unreachable=0    failed=1
```

# 原因

よく考えると当たり前のことだが、 `php-mcrypt` インストールのために必要な **yumリポジトリ** ( `epel-release` ) が、 `--check` オプション付きで実行した場合にはインストールされていないため。

`--check` オプション無しで実行すれば正常終了する。

```sh
[root@068a4db82a8f app]# ansible-playbook -i hosts php-mcrypt.yml
[DEPRECATION WARNING]: DEFAULT_SUDO_USER option, In favor of become which is a generic framework .
This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY [localhost] ***********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [localhost]

TASK [yum] *****************************************************************************************
changed: [localhost]

TASK [yum] *****************************************************************************************
changed: [localhost] => (item=[u'php', u'php-common', u'php-mcrypt'])

PLAY RECAP *****************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0
```

一度 `--check` オプションなしで実行すれば、その後は `--check` オプション付きでもエラーは出ない。

```sh
[root@068a4db82a8f app]# ansible-playbook --check -i hosts php-mcrypt.yml
[DEPRECATION WARNING]: DEFAULT_SUDO_USER option, In favor of become which is a generic framework .
This feature will be removed in version 2.8. Deprecation warnings can be disabled by setting
deprecation_warnings=False in ansible.cfg.

PLAY [localhost] ***********************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [localhost]

TASK [yum] *****************************************************************************************
ok: [localhost]

TASK [yum] *****************************************************************************************
ok: [localhost] => (item=[u'php', u'php-common', u'php-mcrypt'])

PLAY RECAP *****************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0
```