How-to 'vars'?

Hi,

Given a wide-range of distribution versions how does one abstract away the differences?
For example I have to deal with all Ubuntu versions between 10.04 => 14.04, there are differences such as ‘/etc/dhcp’ vs ‘/etc/dhcp3’ and so on.
The ‘group_by’ statement here doesn’t really help since that would result in having to create ~8 configurations.

What I would like to do is in an existing group_vars file say:

dhcp_dir: /etc/dhcp3
when: ansible_distribution_version|compare … otherwise …

Or otherwise do something like this in a task? Perhaps using ‘set_fact’?

Any ideas?

Nico

Hi Nico,

One common way to do this is to use the group_by module to make groups based on the distribution variable, and then to use individual plays to target those groups.

When doing this in a role, you can use include: or include_vars: to bring in task or vars files based on the distribution variable instead.

We have a few examples of this in our integration tests, and in the Tower installation playbook.

Thanks!

Thanks, I was trying to do the following (which pretty much comes straight from the manual) but I can’t get it to work:

(This is within a role)

# Load a variable file based on the OS type, or a default if not found.
- include_vars: "{{ item }}"
  with_first_found:
   - "{{ ansible_distribution }}.yml"
   - "{{ ansible_os_family }}.yml"
   - "default.yml"

result: failed: [hostname] => {"failed": true, "item": null}

I don't see how 'item' is ever going to be 'null' at this point...

I believe with_first_found only searches for files at the moment, it does not look in templates or vars files for this, so you’d have to give it a relative path from the main.yml you’re using it in. For example, assuming this is from tasks/main.yml, you would use:

with_first_found:

  • “…/vars/{{ ansible_distribution }}.yml”
  • “…/vars/{{ ansible_os_family }}.yml”
  • “…/vars/default.yml”

You could skip the last line too, and just have the defaults stored in defaults/main.yml too, and have a “when: item is not None” as a conditional on the include_vars.

I’m afraid that doesn’t work either, same error message.
I even tried ‘with_first_found:’ with a bunch of static values (to verify that it’s not variable dereferencing which doesn’t work in the loop)
However no matter what I feed it, it always returns '“item”: null".