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

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!

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
  syslog_service: rsyslog
else if RedHat6.x
  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
  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
   service: name=syslog state=running enabled=yes
   when: ansible_os_family == "RedHat" and ansible_lsb.major_release == "6"

- name: Ensure syslog is running on Redhat 7.x
   service: name=rsyslog state=running enabled=yes
   when: ansible_os_family == "RedHat" and ansible_lsb.major_release == "7"

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.

include_vars is your friend.

For instance in tasks 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"

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”

`

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

Much better solution. Thanks!

I ended up doing this

`

  • include_vars: “roles/syslog/vars/{{ ansible_os_family }}-{{ ansible_distribution_major_version }}.yml”

`