96 lines
3.0 KiB
Markdown
96 lines
3.0 KiB
Markdown
|
|
Role Info
|
||
|
|
=========
|
||
|
|
|
||
|
|
A role called by another role inline to deep merge variables, this would typically merge custom variables source from a file in 'group_vars' with the role defaults or role vars files.
|
||
|
|
Dictionaries will be merged, nested lists will be appended to.
|
||
|
|
The role makes the assumption that the group_vars file is named the same as the role: role_name = ntp AND variables-file: = group_vars/ntp.yml
|
||
|
|
|
||
|
|
If you only want to overide variables without merge (sometimes necessary where you do not want nested lists to be appended), the ansible 'include_vars' module will suffice.
|
||
|
|
|
||
|
|
```yml
|
||
|
|
- include_vars:
|
||
|
|
file: "{{ ansible_inventory_sources[0] | dirname }}/group_vars/{{ role_name }}.yml"
|
||
|
|
name: "merge_{{ role_name }}"
|
||
|
|
|
||
|
|
- name: merge custom vars to vars[]
|
||
|
|
set_fact:
|
||
|
|
{ "{{ entry }}": "{{ 'merge_'role_name[entry] }}" }
|
||
|
|
loop: "{{ 'merge_'role_name | list }}"
|
||
|
|
loop_control:
|
||
|
|
loop_var: entry
|
||
|
|
|
||
|
|
# - name: merge steel['firewalld'] over role defaults
|
||
|
|
# set_fact:
|
||
|
|
# firewalld: "{{ firewalld | default({}) | combine( steel['firewalld'], recursive=True) }}"
|
||
|
|
# when: steel['firewalld'] is defined
|
||
|
|
```
|
||
|
|
|
||
|
|
Role Variables
|
||
|
|
--------------
|
||
|
|
|
||
|
|
Accepts variables from calling role/task, returns dictionary `vars_return`.
|
||
|
|
|
||
|
|
```yml
|
||
|
|
## set calling role variables
|
||
|
|
- name: set role variable sources
|
||
|
|
set_fact:
|
||
|
|
role_info:
|
||
|
|
role_defaults_file: "{{ role_path }}/defaults/main.yml"
|
||
|
|
role_override_file: "{{ ansible_inventory_sources[0] | dirname }}/group_vars/{{ role_name }}.yml"
|
||
|
|
vars_return: "placeholder"
|
||
|
|
```
|
||
|
|
|
||
|
|
Dependencies
|
||
|
|
------------
|
||
|
|
|
||
|
|
Dependency on the ansible-merge-vars plugin.
|
||
|
|
|
||
|
|
> https://github.com/leapfrogonline/ansible-merge-vars
|
||
|
|
|
||
|
|
Example Playbook
|
||
|
|
----------------
|
||
|
|
|
||
|
|
The top of your calling role/task should include the following block as the first item.
|
||
|
|
Change 'role_defaults_file' and 'role_override_file' file locations to merge variables within files.
|
||
|
|
Only 2 files maybe specified.
|
||
|
|
Omit/replace `merge custom vars to vars[]` task to copy `role_info['vars_return']` to a location of your choosing, by default this task places variables at the root of vars[].
|
||
|
|
|
||
|
|
```yml
|
||
|
|
- name: merge custom vars
|
||
|
|
block:
|
||
|
|
|
||
|
|
- name: set role variable sources
|
||
|
|
set_fact:
|
||
|
|
role_info:
|
||
|
|
role_defaults_file: "{{ role_path }}/defaults/main.yml"
|
||
|
|
role_override_file: "{{ ansible_inventory_sources[0] | dirname }}/group_vars/{{ role_name }}.yml"
|
||
|
|
vars_return: "placeholder"
|
||
|
|
|
||
|
|
- set_fact:
|
||
|
|
source_role: "{{ role_name }}"
|
||
|
|
|
||
|
|
- name: run merge_vars role
|
||
|
|
include_role:
|
||
|
|
name: "merge_vars"
|
||
|
|
vars:
|
||
|
|
a_config_file: "{{ role_info['role_defaults_file'] }}"
|
||
|
|
b_config_file: "{{ role_info['role_override_file'] }}"
|
||
|
|
calling_role: "{{ source_role }}"
|
||
|
|
|
||
|
|
- name: merge custom vars to vars[]
|
||
|
|
set_fact:
|
||
|
|
{ "{{ entry }}": "{{ role_info['vars_return'][entry] }}" }
|
||
|
|
loop: "{{ role_info['vars_return'] | list }}"
|
||
|
|
loop_control:
|
||
|
|
loop_var: entry
|
||
|
|
when:
|
||
|
|
- not role_info['vars_return'] == 'placeholder'
|
||
|
|
|
||
|
|
delegate_to: localhost
|
||
|
|
```
|
||
|
|
|
||
|
|
License
|
||
|
|
-------
|
||
|
|
|
||
|
|
BSD
|