# Display error message if variable isn't set using playbook

**URL:** <https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160>\
**Category:** Ansible Project\
**Created:** [May 5, 2014, 2:53pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160 "2014-05-05T14:53:54Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Sam\_S](https://avatars.discourse-cdn.com/v4/letter/s/edb3f5/32.png) [@Sam\_S](https://forum.ansible.com/u/Sam_S)\
**Post date:** [May 5, 2014, 2:53pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/1 "2014-05-05T14:53:54Z")

</div>

Let’s say I ask for a revision\_no from the user. If the user doesn’t input a value, I would like to display a custom message. Right now ansible shows a bunch of “skipping” message, but I know my users would want to know why it skipped.

- hosts: webservers  
user: deployment

# serial: 1

vars\_prompt:

- name: “revision\_no”  
prompt: “Input revision number”  
private: no

vars\_files:

- “group\_vars/deploy\_list”

roles:

- { role: web, when: revision\_no is not defined }

---

<div class="post-metadata">

**Author:** ![Sam\_S](https://avatars.discourse-cdn.com/v4/letter/s/edb3f5/32.png) [@Sam\_S](https://forum.ansible.com/u/Sam_S)\
**Post date:** [May 5, 2014, 2:58pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/2 "2014-05-05T14:58:27Z")

</div>

That last line is supposed to read “revision\_no is defined”

---

<div class="post-metadata">

**Author:** ![Garrett\_Plasky](https://avatars.discourse-cdn.com/v4/letter/g/5f9b8f/32.png) [@Garrett\_Plasky](https://forum.ansible.com/u/Garrett_Plasky)\
**Post date:** [May 5, 2014, 5:19pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/3 "2014-05-05T17:19:05Z")

</div>

There may be a better way to do this but I solved the problem by having a separate task initially that verifies the variable is set and fails the play if not (via the fail module).

- name: Checking for required variables  
fail: msg=“Playbook execution failed - ‘revision\_no’ is required!”  
when: not revision\_no

If you don’t want the play to outright fail, you could replace the fail module with something like debug.

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [May 6, 2014, 3:51am UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/4 "2014-05-06T03:51:29Z")

</div>

You can say this specifically:

when: revision\_no is not defined

---

<div class="post-metadata">

**Author:** ![Sam\_S](https://avatars.discourse-cdn.com/v4/letter/s/edb3f5/32.png) [@Sam\_S](https://forum.ansible.com/u/Sam_S)\
**Post date:** [May 7, 2014, 8:34pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/5 "2014-05-07T20:34:31Z")

</div>

This does not work for me. Garrett’s example does …

---

<div class="post-metadata">

**Author:** ![Sam\_S](https://avatars.discourse-cdn.com/v4/letter/s/edb3f5/32.png) [@Sam\_S](https://forum.ansible.com/u/Sam_S)\
**Post date:** [May 7, 2014, 9:02pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/6 "2014-05-07T21:02:59Z")

</div>

So, here’s the full site.yml file. If I dont input a revision number (I hit enter at the prompt), it throws the error message as expected BUT it also executes the role. I want it to bomb out w/ the error msg and not continue.

---

<div class="post-metadata">

**Author:** ![Garrett\_Plasky](https://avatars.discourse-cdn.com/v4/letter/g/5f9b8f/32.png) [@Garrett\_Plasky](https://forum.ansible.com/u/Garrett_Plasky)\
**Post date:** [May 7, 2014, 9:21pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/7 "2014-05-07T21:21:58Z")

</div>

I believe this is because variables set via vars\_prompt are always defined.

A workaround might be to set a default for revision\_no and check it doesn’t match in your role, e.g.:

vars\_prompt:

- name: “revision\_no"  
prompt: "Input revision number”  
default: “invalid”  
private: no

……

roles:

- { role: web, when: revision\_no != “invalid” }

I’ve not made extensive use of roles so it seems odd to me that a role would still execute when a failure is thrown but it must have something to do with Ansible’s order of execution.

---

<div class="post-metadata">

**Author:** ![Sam\_S](https://avatars.discourse-cdn.com/v4/letter/s/edb3f5/32.png) [@Sam\_S](https://forum.ansible.com/u/Sam_S)\
**Post date:** [May 7, 2014, 11:36pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/8 "2014-05-07T23:36:13Z")

</div>

I figured it out, not sure if this is valid.

roles:

- { role: web, when: revision\_no }

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan1](https://avatars.discourse-cdn.com/v4/letter/m/5e9695/32.png) [@Michael\_DeHaan1](https://forum.ansible.com/u/Michael_DeHaan1)\
**Post date:** [May 9, 2014, 11:58pm UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/9 "2014-05-09T23:58:24Z")

</div>

Seems like your variable is defined then, just False.

---

<div class="post-metadata">

**Author:** ![Stanislav\_Antic](https://avatars.discourse-cdn.com/v4/letter/s/e9c0ed/32.png) [@Stanislav\_Antic](https://forum.ansible.com/u/Stanislav_Antic)\
**Post date:** [May 10, 2014, 7:41am UTC](https://forum.ansible.com/t/display-error-message-if-variable-isnt-set-using-playbook/15160/10 "2014-05-10T07:41:45Z")

</div>

not revision\_no works because of you just do Enter it will have empty string and empty string is False. It’s matter of preference but I would test for that.

You can always do debug to see true value:

tasks:

- debug: msg={{revision\_no}}
