# How to set a variable in vars/main.yml conditionally?

**URL:** <https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455>\
**Category:** Ansible Project\
**Created:** [September 1, 2016, 4:02pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455 "2016-09-01T16:02:09Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![ZillaYT](https://avatars.discourse-cdn.com/v4/letter/z/4da419/32.png) [@ZillaYT](https://forum.ansible.com/u/ZillaYT)\
**Post date:** [September 1, 2016, 4:02pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/1 "2016-09-01T16:02:09Z")

</div>

I’m writing a role to configure syslog, and of course the service is different between Linux instances. How do I do this in var/main.yml?

`

# pseudo-code in vars/main.yml

if Redhat7.x  
syslog\_service: rsyslog  
else if RedHat6.x  
syslog\_service: syslog  
end

`

So then I can just do this in tasks/main.yml

`

- name: Ensure syslog is running  
service: name=“{{ syslog\_service }}” state=running enabled=yes

`

Thanks!

---

<div class="post-metadata">

**Author:** ![Kai\_Stian\_Olstad](https://avatars.discourse-cdn.com/v4/letter/k/e19adc/32.png) [@Kai\_Stian\_Olstad](https://forum.ansible.com/u/Kai_Stian_Olstad)\
**Post date:** [September 1, 2016, 5:44pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/2 "2016-09-01T17:44:30Z")

</div>

> I'm writing a role to configure syslog, and of course the service is  
> different between Linux instances. How do I do this in var/main.yml?

The directory must be vars not var.

> # pseudo-code in vars/main.yml  
> if Redhat7.x  
> &nbsp;&nbsp;syslog\_service: rsyslog  
> else if RedHat6.x  
> &nbsp;&nbsp;syslog\_service: syslog  
> end

It's not possible, vars/main.yml can only contain variable definitions, not logic.

> So then I can just do this in tasks/main.yml
> 
> - name: Ensure syslog is running  
> &nbsp;&nbsp;service: name="{{ syslog\_service }}" state=running enabled=yes

You must split it in two tasks.  
ansible\_os\_family and ansible\_lsb.major\_release values is probably wrong so you need to find the correct ones.

- name: Ensure syslog is running on Redhat 6.x  
&nbsp;&nbsp;&nbsp;service: name=syslog state=running enabled=yes  
&nbsp;&nbsp;&nbsp;when: ansible\_os\_family == "RedHat" and ansible\_lsb.major\_release == "6"

- name: Ensure syslog is running on Redhat 7.x  
&nbsp;&nbsp;&nbsp;service: name=rsyslog state=running enabled=yes  
&nbsp;&nbsp;&nbsp;when: ansible\_os\_family == "RedHat" and ansible\_lsb.major\_release == "7"

---

<div class="post-metadata">

**Author:** ![ZillaYT](https://avatars.discourse-cdn.com/v4/letter/z/4da419/32.png) [@ZillaYT](https://forum.ansible.com/u/ZillaYT)\
**Post date:** [September 1, 2016, 5:54pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/3 "2016-09-01T17:54:25Z")

</div>

Having a lot of -name/when task blocks is just ugly infrastructure. I have to think of a better way. There’s GOT to be a better way.

---

<div class="post-metadata">

**Author:** ![Allen\_Sanabria1](https://avatars.discourse-cdn.com/v4/letter/a/85e7bf/32.png) [@Allen\_Sanabria1](https://forum.ansible.com/u/Allen_Sanabria1)\
**Post date:** [September 1, 2016, 6:02pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/4 "2016-09-01T18:02:50Z")

</div>

include\_vars is your friend.

For instance in tasks you can say…

```yaml
- include_vars: RedHat6.yml
when: ansible_os_family == "RedHat" and ansible_lsb.major_release == "6"

- include_vars: RedHat7.yml
when: ansible_os_family == "RedHat" and ansible_lsb.major_release == "7"

```

---

<div class="post-metadata">

**Author:** ![Allen\_Sanabria1](https://avatars.discourse-cdn.com/v4/letter/a/85e7bf/32.png) [@Allen\_Sanabria1](https://forum.ansible.com/u/Allen_Sanabria1)\
**Post date:** [September 1, 2016, 6:04pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/5 "2016-09-01T18:04:11Z")

</div>

include\_vars is your friend.

For instance in tasks/main.yml you can say…

`

- include\_vars: RedHat6.yml

when: ansible\_os\_family == “RedHat” and ansible\_lsb.major\_release == “6”

- include\_vars: RedHat7.yml  
when: ansible\_os\_family == “RedHat” and ansible\_lsb.major\_release == “7”

`

---

<div class="post-metadata">

**Author:** ![sivel](https://sea1.discourse-cdn.com/ansible/user_avatar/forum.ansible.com/sivel/32/1198_2.png) [@sivel](https://forum.ansible.com/u/sivel)\
**Post date:** [September 1, 2016, 6:07pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/6 "2016-09-01T18:07:25Z")

</div>

Additionally you can make syslog\_service a dictionary value with keys for the different versions:

vars/main.yml

syslog\_service:

“6”: syslog  
“7”: rsyslog

Then just do:

- name: Ensure syslog is running  
service: name=“{{ syslog\_service[ansible\_distribution\_major\_version] }}” state=running enabled=yes

---

<div class="post-metadata">

**Author:** ![ZillaYT](https://avatars.discourse-cdn.com/v4/letter/z/4da419/32.png) [@ZillaYT](https://forum.ansible.com/u/ZillaYT)\
**Post date:** [September 1, 2016, 6:30pm UTC](https://forum.ansible.com/t/how-to-set-a-variable-in-vars-main-yml-conditionally/22455/7 "2016-09-01T18:30:21Z")

</div>

Much better solution. Thanks!

I ended up doing this

`

- include\_vars: “roles/syslog/vars/{{ ansible\_os\_family }}-{{ ansible\_distribution\_major\_version }}.yml”

`
