17

Is there a way to destroy the variable in Ansible?

Actually, I have a {{version}} variable being used in my all roles for respective packages. When I run multiple roles, the version value of one role is passed to another - this is due to for some role I am not giving version value so that it can install the default version of that package available for respective m/c like ubuntu/redhat etc.

Here is my role template. The value of {{version}} from mysql is being passed to rabbitmq.

    roles:
- { role: mysql }
- { role: rabbitmq}

If I can destory/delete the value of version in every role, it should solve the problem, I believe.

peterh
  • 4,914
  • 13
  • 29
  • 44
MMA
  • 355
  • 3
  • 7
  • 16

5 Answers5

15

As already pointed out it is not possible to unset a variable in Ansible.

Avoid this situation by adding a prefix to your variable names like rabbitmq_version and so on. IMHO this a best practice.

Beside avoiding the situation you ran into, this will add clarity to your host_vars and group_vars.

Henrik Pingel
  • 8,676
  • 2
  • 24
  • 38
8

To unset a variable, try running a set_fact task setting the variable to null, like:

- name: Unset variables
  set_fact:
    version:
    other_var:

If you have a full dictionary that could just override the dict with null, like:

- name: Set dict
  set_fact:
    dict:
      rabbitmq_version: 1
      other_version: 2

- name: override dict to null
  set_fact:
    dict:

Something like other_var: just is "other_var": null in JSON. That is how you can unset variables in Ansible. Have a nice day.

Jordan Stewart
  • 241
  • 2
  • 6
  • I don't know what you mean by `null`, but your first example sets those facts to the empty string, not undefined (as I just discovered). – reinierpost May 18 '21 at 16:43
  • FWIW this approach combined with [omit filter](https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#making-variables-optional) could allow the null or empty string to be sensed to drop the version key. It would need to be done whereever the variable is used though, rather than where the variable is set. – Jasmine Hegman Oct 11 '21 at 03:50
7

No, there is no way to unset a variable (top level) in Ansible.

The only thing you can do, is to create a dictionary and store the variable as a key in this dictionary. Clearing the "parent" dictionary will essentially make the dictionary.key is defined conditional expression work.

techraf
  • 4,163
  • 8
  • 27
  • 44
4

you should use variable per role instead:

  roles:
    - role: mysql
      version: mysql_version
    - role: rabbitmq
      version: rabbitmq_version

or

  roles:
    - { role: mysql, version: mysql_version }
    - { role: rabbitmq, version: rabbitmq_version }
Radu Toader
  • 151
  • 3
-3

You can set it to nothing. I'm currently using it like that:

variable_name: ''
Rafal
  • 1