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:
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, 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".