はじめに
Ansible の yum モジュールでパッケージを指定したとき、通常ですとインストールがすでにされているか否かを気にする必要はなく、冪等性の担保も意識する必要がございません。
これと同じ気持ちで remi-release-7.rpm を yum モジュールでインストールしましたところ、2 回目のインストールで失敗してしまいました><。
TASK [php-fpm : Install remi-release-7] **************************************** fatal: [default]: FAILED! => {"changed": true, "failed": true, "msg": "エラー: 何もしません\n", "rc": 1, "results": ["読み込んだプラグイン:fastestmirror\n/var/tmp/yum-root-YOhnx0/remi-release-7.rpm を調べています: remi-release-7.3-1.el7.remi.noarch\n/var/tmp/yum-root-YOhnx0/remi-release-7.rpm: インストールされたパッケージを更新しません。\n"]} to retry, use: --limit @/vagrant/ansible/site.retry
したがいまして、remi-release-7.rpm がインストールされているかどうかを評価する記述を追加しなければなりません!
今回は、その記録をノートいたします。
ポイント
- stat を使用してインストールされるファイルの状態を取得する処理を入れ、結果を register を使って変数に代入する。
- 変数.stat.exits を評価することでファイルの存在をチェックする。
- デバッグ出力で内容を確認するために、debug を使用する。
Ansible コード例
- name: check remi-release-7 stat: path=/etc/yum.repos.d/remi-php70.repo register: remi_release_7 # ↓これはデバッグ用のため、不要となったら削除する。 - debug: var=remi_release_7 - name: Install remi-release-7 yum: name: http://rpms.famillecollet.com/enterprise/remi-release-7.rpm state: latest when: remi_release_7.stat.exists == false - name: Install php-fpm and deps yum: name={{ item }} enablerepo=remi-php71 state=latest with_items: - php - php-fpm - php-enchant - php-IDNA_Convert - php-mbstring - php-mysql - php-PHPMailer - php-process - php-simplepie - php-xml
実際に動かした時の出力
remi-release-7未インストールな1回目の実行結果
remi-release-7 はインストールしていない状態からのスタートですので、remi_release_7 の状態は remi_release_7.stat.exists は false となります。
when を使用して、条件に remi_release_7.stat.exists が false の時のみ remi-release-7.rpm をインストールいたしますた。
以上の様子が確認できますわね♪
TASK [php-fpm : check remi-release-7] ****************************************** ok: [default] TASK [php-fpm : debug] ********************************************************* ok: [default] => { "remi_release_7": { "changed": false, "stat": { "exists": false } } } TASK [php-fpm : Install remi-release-7] **************************************** changed: [default] TASK [php-fpm : Install php-fpm and deps] ************************************** changed: [default] => (item=[u'php', u'php-fpm', u'php-enchant', u'php-IDNA_Convert', u'php-mbstring', u'php-mysql', u'php-PHPMailer', u'php-process', u'php-simplepie', u'php-xml'])
remi-release-7インストール後、2回目の実行結果
1 回目の Ansible 実行により remi-release-7.rpm はインストール済みとなっております。
その結果、デバッグ出力した remi_release_7 変数の中身は、インストールされた状態の分だけ 1 回目よりも遥かに情報量が増えておりますの♪
remi_release_7.stat.exists は true ですので、remi-release-7.rpm のインストールはスキップされますわ!
以上の様子が、次の出力からわかりますわね♪
TASK [php-fpm : check remi-release-7] ****************************************** ok: [default] TASK [php-fpm : debug] ********************************************************* ok: [default] => { "remi_release_7": { "changed": false, "stat": { "atime": 1488894158.4026325, "checksum": "bbc61662ae43fa6015042ea043f86581ce6e118f", "ctime": 1488894157.701983, "dev": 64768, "executable": false, "exists": true, "gid": 0, "gr_name": "root", "inode": 67741159, "isblk": false, "ischr": false, "isdir": false, "isfifo": false, "isgid": false, "islnk": false, "isreg": true, "issock": false, "isuid": false, "md5": "ed7792cb9903248db7a15590024e413e", "mode": "0644", "mtime": 1486733264.0, "nlink": 1, "path": "/etc/yum.repos.d/remi-php70.repo", "pw_name": "root", "readable": true, "rgrp": true, "roth": true, "rusr": true, "size": 1316, "uid": 0, "wgrp": false, "woth": false, "writeable": true, "wusr": true, "xgrp": false, "xoth": false, "xusr": false } } } TASK [php-fpm : Install remi-release-7] **************************************** skipping: [default] TASK [php-fpm : Install php-fpm and deps] ************************************** changed: [default] => (item=[u'php', u'php-fpm', u'php-enchant', u'php-IDNA_Convert', u'php-mbstring', u'php-mysql', u'php-PHPMailer', u'php-process', u'php-simplepie', u'php-xml'])
おわりに
次のページが参考になりました!ありがとう存じます!
- Ansibleで冪等性を保つためにはfailed_whenとかstatを使うと便利 – 銀色うつ時間
こちらのページではファイルの存在チェックに、変数.stat.md5 を使用しております。これを本投稿では応用しました。 - [Ansible] コマンドの実行結果に応じて別のコマンドを実行するかしないかを制御する – Qiita
以上です。