How-to 'vars'?

59 views
Skip to first unread message

Nico K.

unread,
Sep 18, 2014, 9:42:59 AM9/18/14
to ansible...@googlegroups.com
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

James Cammarata

unread,
Sep 18, 2014, 9:54:26 AM9/18/14
to ansible...@googlegroups.com
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!

--
You received this message because you are subscribed to the Google Groups "Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ansible-proje...@googlegroups.com.
To post to this group, send email to ansible...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/991dfe1c-8b2f-4892-9159-3c6caf9b70d9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Nico K.

unread,
Sep 18, 2014, 11:03:44 AM9/18/14
to ansible...@googlegroups.com
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...



Op donderdag 18 september 2014 15:54:26 UTC+2 schreef James Cammarata:

James Cammarata

unread,
Sep 18, 2014, 11:39:30 AM9/18/14
to ansible...@googlegroups.com
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.

Nico K.

unread,
Sep 19, 2014, 3:07:17 AM9/19/14
to ansible...@googlegroups.com
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".

Op donderdag 18 september 2014 17:39:30 UTC+2 schreef James Cammarata:
Reply all
Reply to author
Forward
0 new messages