2015-05-28 11 views
7

Oto moja group_vars/all file:dostępu zagnieżdżonych zmiennych zmiennych w ansibl

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 

Jeśli app_env środowisko musi być produkcję, ja to poprzez nadpisanie zmiennych zapasów. W ten sposób wszystkie wdrożenia są przeprowadzane na etapie wdrażania, chyba że wyraźnie je udostępnisz.

Tak, gdy chcę wydrukować zmiennej w playbook, mogę zrobić

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

To działa!

Ale w jaki sposób mogę uzyskać dostęp do zmiennej w innym module, tzn. Lineinfile?

kilka przykładów, które nie wyszło:

- 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 }}"' 

roztwory robocze będzie z wykorzystaniem modułu set_fact (podwójne linie kodu, nie bardzo inteligentny) lub tym różne pliki zmienne, w zależności od app_env.

Ale ja naprawdę chciałbym wiedzieć, czy tam oznaczenie dostęp do zagnieżdżonych zmiennych zmiennych;)

Odpowiedz

13

Można by ułatwić Ci życie z „dict środowisko” nie będącej u podstaw, tak jak poniżej:

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 

Następnie powinieneś być w stanie używać wszędzie: {{app_environments[app_env].app_a.db_host}} lub {{app_environments[app_env]['app_a']['db_host']}} (szablony, zadania).

Mimo to uważaj na zbyt wiele "gniazdowania"!