Is there a way to check that a dictionary key is not defined in ansible task?

76,956

Solution 1

The syntax you included:

when: me.cool is not defined

is correct.

You can also use not in:

when: "'cool' not in me"

The problem is that your error message:

The conditional check 'me.cool' failed.

claims your condition is defined as:

when: me.cool

So, either there is some bug in the version you use (but you did not share which one it is) and there were known issues, or you did not post the exact task that caused the error.

Solution 2

You can avoid 'dict object' has no attribute by using jinja2 selectattr() syntax as in :

when: me|selectattr("cool", "defined")|list|length >0

idea obtained from Michael Hoglan at https://groups.google.com/forum/#!topic/ansible-project/8XJkHQgttLA

Share:
76,956

Related videos on Youtube

Luis F Hernandez
Author by

Luis F Hernandez

Updated on September 18, 2022

Comments

  • Luis F Hernandez
    Luis F Hernandez over 1 year

    So in my code I have a task

    - name: cool task
      shell: 'touch iamnotcool.txt'
      when: me.cool is not defined
    

    and my vars looks like

    ---
    me:
      stumped: yes
    

    So when I run the task it comes back with the following error

    {"failed": true, "msg": "The conditional check 'me.cool' failed. The error was: error while evaluating conditional (me.cool): 'dict object' has no attribute 'cool'.
    
  • Aiyion.Prime
    Aiyion.Prime almost 5 years
    The error could still happen, if he did not post the original code an ommited a second when-condition which refers to the same value. This works: when: is_installed.rc is defined and is_installed.rc == 0 This does not: when: is_installed.rc is defined \n when is_installed.rc == 0
  • Stuart Cardall
    Stuart Cardall about 2 years
    this form is useful for putting in front of the condition which failed (& which you still possibly want to check for) - i.e: when: source_subdirs.matched is not defined or source_subdirs.matched == 0