はじめに
特定のパッケージがインストール済みであることを確認する Playbook です。
- 動作確認環境
- ansible 2.9.19
- ansible-base 2.10.4
仕組みは以下のとおりです。
yum
モジュールのstate
オプションでinstalled
を指定する- このタスクをチェックモードで実行する
- 結果の
changed
がfalse
であればインストール済みと判断できる
Playbook
--- - hosts: sv gather_facts: false become: true tasks: - name: yum (check mode) yum: name: httpd state: installed check_mode: true # ここ大事 register: result_yum_installed - name: assert httpd installed assert: that: - not result_yum_installed.changed
実行
インストール済み、してない場合でそれぞれ Playbook を実行したときのログを掲載します。
インストール済みの場合
インストール済みの場合は、assert
が成功します。
$ ansible-playbook -i inventory.ini test.yml PLAY [sv] ******************************************************************************************************** TASK [yum (check mode)] ****************************************************************************************** ok: [sv1] TASK [assert httpd installed] ************************************************************************************ ok: [sv1] => { "changed": false, "msg": "All assertions passed" } PLAY RECAP ******************************************************************************************************* sv1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
インストールしていない場合
インストールしてない場合は、assert
が失敗します。
$ ansible-playbook -i inventory.ini test.yml PLAY [sv] ********************************************************************************************************* TASK [yum (check mode)] ******************************************************************************************* changed: [sv1] TASK [assert httpd installed] ************************************************************************************* fatal: [sv1]: FAILED! => { "assertion": "not result_yum_installed.changed", "changed": false, "evaluated_to": false, "msg": "Assertion failed" } PLAY RECAP ******************************************************************************************************** sv1 : ok=1 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
補足
インストールされていないことを確認する場合は、yum
モジュールで state: absent
を指定します。
難点
この方法は、以下の点がやや難点かなと思います。
- 難点1:
check_mode: true
を指定しているとはいえ、state: installed
の指定があるのが危うい - 難点2:
yum
モジュール自体にバグがあると正しく判断できない可能性がある
他の方法
list オプションの利用
yum
モジュールの list
オプションを利用して、パッケージの情報を取得して、その中を確認する方法です。
前述の難点1はこちらで解決できます。
そもそも yum モジュールを使わない
難点1、2を解決する方法です。
latest かどうかを厳密にテストすることは不可能 (時間関数かつ外部要因に依存) なのと、{適用,テスト}コードが同じ yum module 利用だと module に bug があるとまずいので、僕ならあえてテストでは command module で rpm -q <httpd_rpm_name> して結果確認します。
— ssato (@satoru_satoh) 2020年4月11日