Hi,
Have you tried include_vars:
https://docs.ansible.com/ansible/latest/modules/include_vars_module.html
It has such example:
- name: Load a variable file based on the OS type, or a default if not
found. Using free-form to specify the file.
include_vars: "{{ lookup('first_found', possible_files) }}"
vars:
possible_files:
- "{{ ansible_distribution }}.yaml"
- "{{ ansible_os_family }}.yaml"
- default.yaml
On Thu, 13 Jun 2019 at 16:07, Laurent Hoss <[email protected]> wrote:
>
> I've got the same issue (in various roles) and still cannot foresee a good
> enough fix exists (or planned)
>
> - An earlier post with the same question:
> https://groups.google.com/d/msg/ansible-project/jFf1KfoWxBA/KXmcsQZqAQAJ
>
> - Please upvote your favorite solution, in the proposals I gathered in
> following post:
> https://github.com/ansible/proposals/pull/21#issuecomment-470048538
>
> On Tuesday, March 28, 2017 at 6:33:29 PM UTC+2, Mike Ray wrote:
>>
>> In the current Ansible setup, you can have 1 file in defaults (i.e.
>> defaults/main.yml) and it is used for all hosts that run that task, no
>> matter what the host.
>>
>> In our use case, we have found it would be highly advantageous to be able to
>> have os-specific and release-specific defaults files. For instance, some
>> applications change directives between releases -- using a directive in a
>> release that doesn't support it, in the best case just issues a warning
>> (which is not ideal), but in the far more likely case, breaks something.
>>
>> We cannot use include_vars as this completely ruins precedence:
>> http://docs.ansible.com/ansible/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable
>>
>> To illustrate, here is an example/outline of our setup:
>>
>> file structure:
>> - inventory/production/host_vars/mail-server-1
>> - inventory/production/group_vars/mail-servers
>> - roles/servers/mail-server
>> - roles/postfix
>> - mail-server.yml
>>
>> mail-server.yml:
>> roles:
>> - roles/servers/mail-server
>>
>> roles/servers/mail-server/meta/main.yml:
>> dependencies:
>> - { role: postfix }
>>
>>
>> summary: What the above is trying to illustrate, is that we have our
>> re-usable building blocks in "roles" and server-specific setups in
>> "roles/servers", e.g. the "mail-server" role runs through postfix as meta,
>> and then runs through its own tasks. This gives us the flexibility to:
>> - set host-specific vars in the inventory host_vars variables (e.g.
>> relayhost="")
>> - set vars common to particular groupings of mail servers in inventory
>> group_vars variables (e.g. relay_domains=domain.foo)
>> - set vars common to mail-servers in general in
>> roles/servers/mail-server/vars (e.g.
>> content-filter=smtp-amavis:[127.0.0.1]:10024)
>> - set vars for everything that runs the postfix role (e.g. heloname="{{
>> ansible_hostname }}")
>>
>> If for example, we were to use include_vars to try to include variables
>> specific to CentOS, it would be the highest precedence and override host
>> specific settings with generic CentOS stuff.
>>
>>
>>
>> Our current working solution is to do a large amount of "union-ing" in the
>> defaults file based on variables, i.e. to get the proper postfix
>> configuration options trusty v. xenial:
>> postfix_configuration_options: "{{ postfix_common_configuration_options
>> | union( (ansible_distribution_release=='xenial') |
>> ternary(postfix_xenial_configuration_options,[]) ) | union(
>> (ansible_distribution_release=='trusty') |
>> ternary(postfix_trusty_configuration_options,[]) ) }}"
>>
>> This is not ideal for a number of reasons:
>> - unless you already know what it does, it can take some time to figure
>> out
>> - it gets messier and messier the more distributions you support
>> - it'll get slower to run the more distributions are supported
>>
>> But is still useful as you can have a common template for everything then:
>> main.cf.j2:
>> # {{ ansible_managed }}
>> {% for item in postfix_configuration_options %}
>> {% if item.option is defined and item.value is defined %}
>> {% if item.comment is defined %}
>> {{ item.comment }}
>> {% endif %}
>> {{ item.option }} = {{ item.value }}
>> {% endif %}
>> {% endfor %}
>>
>>
>>
>>
>> What we had planned on doing was using the meta structure to include
>> specific roles with particular defaults based on os and release, e.g.:
>>
>> - mail-server.yml:
>> roles:
>> - meta/postfix
>>
>> - meta/postfix/meta/main.yml:
>> dependencies:
>> - { role: os/CentOS/postfix, when: ansible_distribution ==
>> 'CentOS' }
>> - { role: releases/trusty/postfix, when:
>> ansible_distribution_release == 'trusty' }
>> - { role: releases/xenial/postfix, when:
>> ansible_distribution_release == 'xenial' }
>> - { role: postfix }
>>
>> - release/trusty/postfix/defaults/main.yml:
>> postfix_configuration_options:
>> postscreen_dnsbl_ttl
>>
>> - release/trusty
>> postfix_configuration_options:
>> address_verify_pending_request_limit
>>
>> And then in the aforementioned main.cf.j2, xenial hosts would define
>> "address_verify_pending_request_limit" (which is not a thing available in
>> the postfix release for trusty) and trusty hosts would define
>> "postscreen_dnsbl_ttl" (which is not a thing available in the postfix
>> release for xenial).
>>
>> While it works for that case, I've found that even when a meta role is
>> skipped, the defaults file is still read, so for situations where you had
>> the same directive, but wanted different values based on os/release, it
>> would not work (i.e. in the following example, "biff" would always be set to
>> "yes"):
>>
>> - release/trusty/postfix/defaults/main.yml:
>> postfix_configuration_options:
>> biff = no
>>
>> - release/trusty
>> postfix_configuration_options:
>> biff = yes
>>
>>
>>
>> Does anyone have any ideas for how to have a defaults file per os/release
>> like I want? Does anyone have alternative suggestions on setups such that I
>> would not need/want this anymore?
>
> --
> 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 [email protected].
> To post to this group, send email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/ansible-project/188121b2-963a-4840-a65b-f05d1a97bcf1%40googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
--
Dr Wawrzyniec NiewodniczaĆski or Wawrzek for short
PhD in Quantum Chemistry & MSc in Molecular Engineering
WWW: http://wawrzek.name E-MAIL: [email protected]
Linux User #177124
--
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/ansible-project/CAC7-vpBirWng2v96mszBERX8%3Do2tYQs_wRu_O8n0x0aCKyj_mQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.