bug
Ansible
centos7
ansible-playbook

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

背景

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

環境

OS

CentOS7

Ansibleスクリプト

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

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

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

実行結果

[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 オプション無しで実行すれば正常終了する。

[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 オプション付きでもエラーは出ない。

[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