# Best practices with roles and variables

**URL:** <https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793>\
**Category:** Ansible Project\
**Created:** [May 10, 2013, 9:25pm UTC](https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793 "2013-05-10T21:25:41Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Luca\_Berruti](https://avatars.discourse-cdn.com/v4/letter/l/258eb7/32.png) [@Luca\_Berruti](https://forum.ansible.com/u/Luca_Berruti)\
**Post date:** [May 10, 2013, 9:25pm UTC](https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793/1 "2013-05-10T21:25:41Z")

</div>

Hi,

Suppose to have a variable (Y) used inside a role (X).  
Y is defined inside roles/X/vars/main.yml as “Y: reasonable\_default\_value”

What about if host (A) must have its Y custom value?

- “Y: a\_custom\_value” inside host\_vars/A doesn’t work (by design or bug?)  
This is a working solution (obviously with “Y: a\_custom\_value” inside vars/A.yml):

# playbook

- hosts: all  
vars\_files:

- [“vars/{{ inventory\_hostname }}.yml”, “vars/defaults.yml”]  
roles:

- role: X

Are there other better methods?

Thank you!

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan2](https://avatars.discourse-cdn.com/v4/letter/m/da6949/32.png) [@Michael\_DeHaan2](https://forum.ansible.com/u/Michael_DeHaan2)\
**Post date:** [May 10, 2013, 9:38pm UTC](https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793/2 "2013-05-10T21:38:10Z")

</div>

In Jinja2, I believe you want {{ x | default y }}

---

<div class="post-metadata">

**Author:** ![Luca\_Berruti](https://avatars.discourse-cdn.com/v4/letter/l/258eb7/32.png) [@Luca\_Berruti](https://forum.ansible.com/u/Luca_Berruti)\
**Post date:** [May 11, 2013, 8:03am UTC](https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793/3 "2013-05-11T08:03:14Z")

</div>

It might be so?

# playbook

- hosts: all  
roles:
- role: x

# roles/x/vars/main.yml

y: “{{ y1 | default(‘reasonable\_default\_value’) }}”

# roles/x/tasks/main.yml

# {{ y }} used in many place: tasks, template, etc

# host\_vars/A

y1: a\_custom\_value

If so:

- variables defined inside roles/x/vars/main.yml are defaults

- variables defined inside roles/x/vars/main.yml can be “overridden” by using

1. vars\_files
2. another variable and jinja default (y1 → y)  
it’s right?

---

<div class="post-metadata">

**Author:** ![Michael\_DeHaan2](https://avatars.discourse-cdn.com/v4/letter/m/da6949/32.png) [@Michael\_DeHaan2](https://forum.ansible.com/u/Michael_DeHaan2)\
**Post date:** [May 11, 2013, 12:34pm UTC](https://forum.ansible.com/t/best-practices-with-roles-and-variables/12793/4 "2013-05-11T12:34:33Z")

</div>

Correct.
