Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

accessing nested variable variables in ansible

Tags:

ansible

Here is my group_vars/all file:

app_env: staging

staging:
  app_a:
    db_host: localhost
  app_b:
    db_host: localhost
production:
  app_a:
    db_host: app_a-db.example.net
  app_b:
    db_host: app_b-db.example.com

If app_env environment has to be production, I overwrite this via inventory variables. This way, all deployments are staging unless you make them production explicitly.

So, when I want to print the variable in a playbook, I can do

---
  - debug: var={{app_env}}.app_a.db_host

This works!

But how can I access the variable in another module, i.e. lineinfile?

Some Examples that didn't work out:

- lineinfile: dest=/etc/profile line='export APP_A_DB_HOST="{{ app_env.app_a.db_host }}"'
- lineinfile: dest=/etc/profile line='export APP_A_DB_HOST="{{ app_env[app_a][db_host] }}"'
- lineinfile: dest=/etc/profile line='export APP_A_DB_HOST="{{ {{app_env}}.app_a.db_host }}"'

Working solutions would be using the set_fact module (double lines of code, not really smart) or including different variable files, depending on app_env.

But I really would like to know if there's a notation to access nested variable variables ;)

like image 413
witsches Avatar asked May 28 '15 08:05

witsches


1 Answers

You would make your life easier with your 'environment dict' not being at the root, like so:

app_env: staging

app_environments:
  staging:
    app_a:
      db_host: localhost
    app_b:
      db_host: localhost
  production:
    app_a:
      db_host: app_a-db.example.net
    app_b:
      db_host: app_b-db.example.com

Then, you should be able to use {{app_environments[app_env].app_a.db_host}} or {{app_environments[app_env]['app_a']['db_host']}} everywhere (Jinja templates, tasks).

Watch out for too much "nestiness" though !

like image 73
leucos Avatar answered Sep 28 '22 08:09

leucos