Is it possible to create an Ansible inventory variable that isn't 
associated with an inventory host or group but the server tier the playbook 
is run on?  I have an Ansible role that installs the libffi-dev package 
using APT, but I may want to install a different version of that package on 
each server tier.  I've created a variable "libffi-dev_ver" for that 
purpose.  I also have the inventory files "development", "staging", and 
"production" that correspond to each of my tiers.

My role's main task, which is called from my main site.yml playbook, checks 
that version variable exists prior to running the role:

    # roles/misc_libs/tasks/main.yml
    - include: check_vars.yml tags=misc_libs
    - include: misc_libs.yml tags=misc_libs

check_vars.yml checks to ensure that the package version variable exists:

    # roles/misc_libs_tasks/check_vars.yml
    - name: check that required role variables are set
      fail: msg="{{ item }} is not defined"
      when: not {{ item }}
      with_items:
        - libffi-dev_ver

The misc_libs role actually uses that variable to install the package:

    # roles/misc_libs/tasks/misc_libs.yml
    - name: install libffi-dev
      apt: >
        pkg=libffi-dev={{ libffi-dev_ver }}
        update_cache=yes
        cache_valid_time=3600
      become: True

My development inventory file looks like this:

    # development
    [webservers]
    web01.example.com ansible_ssh_host=<ip_address>

    [dev:children]
    webservers
    
    [webservers:vars]
    libffi-dev_ver="3.1-2+b2"

When I run this command:

    ansible-playbook -i development site.yml -l webservers

I get this Ansible error:

    fatal: [web01.example.com] => error while evaluating conditional: not 
libffi-dev_ver

What is the correct way to declare a package versioning variable like this 
in Ansible?  The variable's value depends on the server tier which 
indicates to me that it goes in an inventory file since inventory files are 
server tier-specific.  But all inventory variables seem to have to be 
associated with a host or group.  I've done that but the role still doesn't 
see the variable.  I could add a task to the role that detects the server 
tier and uses a "when" conditional to set the variable accordingly but that 
solution seems ugly because if you're installing multiple packages in a 
role, you'd need three conditionals for each package version variable. 
 I've looked through the Ansible documentation and read numerous blog posts 
on setting up multi-tier playbooks but I don't see this particular 
situation addressed.  What's the right way to declare a tier-specific 
variable like this?

Thanks!

-- 
You received this message because you are subscribed to the Google Groups 
"Ansible Project" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/ansible-project/ad513ee6-cd89-4e97-8564-9ab307385cec%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to