jeromew
jeromew

Reputation: 3

Ansible : use a fact variable with a dictionary variable

I would like to install Apache on several linux server. Apache package has not the same name on RedHat or Debian operating system (apache2 vs httpd): Is it a way to use an ansible fact variable ("ansible_os_family") as a key of a dictionary variable ?

Something like that (but this doesn't work) :

---
- name: playbook1
  hosts: all
  become: yes
  vars:
    apache_packages: {
      "RedHat": "httpd",
      "Debian": "apache2"
      }
  tasks:
    - name: Install Apache server
      package:
        name:  "{{ apache_packages['{{ ansible_os_family }}']  }}"
        state: present
...

Upvotes: 0

Views: 426

Answers (3)

antogx
antogx

Reputation: 226

I would do some thing like below to reduce the lines

- hosts: localhost
  become: yes 
  tasks:
  - package:
      name: "{{ 'apache2' if ansible_os_family == 'Debian' else ('httpd' if ansible_os_family == 'RedHat') }}"
      state: present

Upvotes: 0

idriss Eliguene
idriss Eliguene

Reputation: 897

try this: you define packages as a dict of list (based on os family)

- name: playbook1
  hosts: localhost
  become: yes
  vars:
    packages:
      debian:
        - apache2
      redhat:
        - httpd
  tasks:
    - name: Install Apache server
      package:
        name:  "{{ item }}"
        state: present
      loop: "{{ packages.get(ansible_os_family|lower) }}"

Upvotes: 0

β.εηοιτ.βε
β.εηοιτ.βε

Reputation: 39099

Nesting Jinja delimiters inside another Jinja delimiter is never a good idea.

Another rule is ‘moustaches don’t stack’. We often see this:

{{ somevar_{{other_var}} }}

The above DOES NOT WORK as you expect, if you need to use a dynamic variable use the following as appropriate:

{{ hostvars[inventory_hostname]['somevar_' + other_var] }}

For ‘non host vars’ you can use the vars lookup plugin:

{{ lookup('vars', 'somevar_' + other_var) }}

Source: https://docs.ansible.com/ansible/latest/reference_appendices/faq.html#when-should-i-use-also-how-to-interpolate-variables-or-dynamic-variable-names

If you don't surround something with quotes, it will be assumed as being a variable, so in this case, this is as simple as:

name:  "{{ apache_packages[ansible_os_family] }}"

Upvotes: 1

Related Questions