てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] yum モジュールで特定のパッケージがインストール済みであることを確認する

はじめに

特定のパッケージがインストール済みであることを確認する Playbook です。

  • 動作確認環境
    • ansible 2.9.19
    • ansible-base 2.10.4

仕組みは以下のとおりです。

  • yum モジュールstate オプションで installed を指定する
  • このタスクをチェックモードで実行する
  • 結果の changedfalse であればインストール済みと判断できる

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はこちらで解決できます。

qiita.com

そもそも yum モジュールを使わない

難点1、2を解決する方法です。