Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rewrite precedence rules for more clarify #2112

Open
wants to merge 2 commits into
base: devel
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 13 additions & 10 deletions docs/docsite/rst/playbook_guide/playbooks_variables.rst
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ You can use the `set_fact` module to combine lists into a new `merged_list` vari
- peach
- plum
- pear

tasks:
- name: Combine list1 and list2 into a merged_list var
ansible.builtin.set_fact:
Expand Down Expand Up @@ -425,16 +425,17 @@ Ansible does apply variable precedence, and you might have a use for it. Here is

#. command line values (for example, ``-u my_user``, these are not variables)
#. role defaults (as defined in :ref:`Role directory structure <role_directory_structure>`) [1]_
#. inventory file or script group vars [2]_
#. inventory group_vars/all [3]_
#. playbook group_vars/all [3]_
#. inventory group_vars/* [3]_
#. playbook group_vars/* [3]_
#. inventory file or script host vars [2]_
#. inventory host_vars/* [3]_
#. playbook host_vars/* [3]_
#. variables for group "all" defined inside of an inventory file or script [2]_
#. other group vars defined inside of an inventory file or script [2]_
#. inventory ``group_vars/all`` (a file in the ``group_vars/`` directory that is adjacent to the inventory) [3]_
#. playbook ``group_vars/all`` (a file in the ``group_vars/`` directory that is adjacent to the playbook) [3]_
#. inventory ``group_vars/*`` (a file in the ``group_vars/`` directory that is adjacent to the inventory) [3]_
#. playbook ``group_vars/*`` (a file in the ``group_vars/`` directory that is adjacent to the playbook) [3]_
#. host vars defined in an inventory file or script [2]_
#. inventory ``host_vars/*`` (a file in the ``host_vars/`` directory that is adjacent to the inventory) [3]_
#. playbook ``host_vars/*`` (a file in the ``host_vars/`` directory that is adjacent to the inventory) [3]_
#. host facts / cached set_facts [4]_
#. play vars
#. play vars (defined in the section vars for the play)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
#. play vars (defined in the section vars for the play)
#. play vars (defined in the ``vars`` section for the play)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are also vars_prompt and vars_files

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It was added by Don Naro

#. play vars_prompt
#. play vars_files
#. role vars (as defined in :ref:`Role directory structure <role_directory_structure>`)
Expand All @@ -446,6 +447,8 @@ Ansible does apply variable precedence, and you might have a use for it. Here is
#. include params
#. extra vars (for example, ``-e "user=my_user"``)(always win precedence)

If inventory file is located in the same directory as a playbook, adjacent group_vars/ are interpreted twice both as inventory group_vars/ and playbook group_vars/, therefore, getting precedence of the playbook group_vars.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If inventory file is located in the same directory as a playbook, adjacent group_vars/ are interpreted twice both as inventory group_vars/ and playbook group_vars/, therefore, getting precedence of the playbook group_vars.
If an inventory file is located in the same directory as a playbook, adjacent ``group_vars/`` are interpreted twice, both as inventory ``group_vars/`` and playbook ``group_vars/``. As a result, the ``group_vars/`` from the inventory file get precedence over the playbook ``group_vars``.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect, at no point does the inventory file get precedence over the playbook's group_vars.

What happens is that since the file is processed x2, it ends up with the highest precedence, that of the playbook relative file.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, thank you for suggestion I accept it, but correct for playbook been 'stronger'.


In general, Ansible gives precedence to variables that were defined more recently, more actively, and with more explicit scope. Variables in the defaults folder inside a role are easily overridden. Anything in the vars directory of the role overrides previous versions of that variable in the namespace. Host and/or inventory variables override role defaults, but explicit includes such as the vars directory or an ``include_vars`` task override inventory variables.

Ansible merges different variables set in inventory so that more specific settings override more generic settings. For example, ``ansible_ssh_user`` specified as a group_var is overridden by ``ansible_user`` specified as a host_var. For details about the precedence of variables set in inventory, see :ref:`how_we_merge`.
Expand Down
Loading