The problem was that the variable 'libffi-dev_ver' I declared is actually a 
Jinja2 
[identifier](http://jinja.pocoo.org/docs/dev/api/#notes-on-identifiers) 
that must adhere to Python 2.x naming rules.  The '-' (dash) is an invalid 
character according to these rules.  Once I changed it to an '_' 
(underscore), I no longer got the error.

Also, the check_vars.yml playbook is actually unnecessary.  There is an 
Ansible configuration variable 
[error_on_undefined_vars](http://docs.ansible.com/ansible/intro_configuration.html#error-on-undefined-vars)
 
which will cause steps containing an undefined variable to fail.  Since 
it's true by default, I don't need to run check_vars.yml as all variables 
are already being checked.

One place to declare server tier-specific variables seems to be in a file 
in the group_vars directory that has the same name as the group which is 
named after that tier in your inventory file.  So in my case my 
'development' inventory file contains a 'dev' child group.  Therefore, I 
created a file 'group_vars/dev' and declared a variable in that file called 
'libffi_dev_ver' which I can reference in my misc_libs.yml playbook.

On Friday, April 29, 2016 at 9:51:32 AM UTC-7, Robert F wrote:
>
> 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/cac5a6be-76b1-4c49-960a-cfa1c2860bbf%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to