Ansible: check if a package is installed on a remote system

By | 03/10/2019

Have a self-written letsencrypt role (see the Prometheus: RTFM blog monitoring set up with Ansible – Grafana, Loki, and promtail post).

Before running the Let’s Encrypt client to obtain a new certificate – need to check if NGINX is installed on a remote host.

Let’s use the package_facts module:

...
- name: "Check if NGINX is installed"
  package_facts:
    manager: "auto"
...

And add a conditional check with when using the ansible_facts.packages array:

...
- name: "NGINX test result"
  debug: 
    msg: "NGINX found"
  when: "'nginx' in ansible_facts.packages"

- name: "NGINX test result"
  debug: 
    msg: "NGINX NOT found"
  when: "'nginx' not in ansible_facts.packages"

Check:

[simterm]

...
TASK [test : Check if NGINX is installed] ****
ok: [ssh.dev.rtfm.co.ua]

TASK [test : NGINX test result] ****
ok: [ssh.dev.rtfm.co.ua] => {
    "msg": "NGINX found"
}

TASK [test : NGINX test result] ****
skipping: [ssh.dev.rtfm.co.ua]

PLAY RECAP ****
ssh.dev.rtfm.co.ua      : ok=3    changed=0    unreachable=0    failed=0 
...

[/simterm]

Remove NGINX:

[simterm]

root@rtfm-do-dev:~# apt purge nginx

[/simterm]

Run again:

[simterm]

...
TASK [test : Check if NGINX is installed] ****
ok: [ssh.dev.rtfm.co.ua]

TASK [test : NGINX test result] ****
skipping: [ssh.dev.rtfm.co.ua]

TASK [test : NGINX test result] ****
ok: [ssh.dev.rtfm.co.ua] => {
    "msg": "NGINX NOT found"
}

PLAY RECAP ****
ssh.dev.rtfm.co.ua      : ok=3    changed=0    unreachable=0    failed=0

[/simterm]

Done.