2015-05-28 25 views
7

Đây là group_vars tôi/all file:truy cập vào các biến biến lồng nhau trong ansible

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 

Nếu app_env môi trường phải được sản xuất, tôi ghi đè này qua biến hàng tồn kho. Bằng cách này, tất cả các triển khai được dàn dựng trừ khi bạn làm cho chúng sản xuất một cách rõ ràng.

Vì vậy, khi tôi muốn in các biến trong một playbook, tôi có thể làm

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

này hoạt động!

Nhưng làm cách nào tôi có thể truy cập Biến trong mô-đun khác, tức là lineinfile?

Một số ví dụ mà không làm việc ra:

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

giải pháp làm việc sẽ được sử dụng các mô-đun set_fact (đường đôi mã, không thực sự thông minh) hoặc bao gồm các file biến khác nhau, tùy thuộc vào app_env.

Nhưng tôi thực sự muốn biết nếu theres một ký hiệu để truy cập các biến biến lồng nhau;)

Trả lời

13

Bạn sẽ làm cho cuộc sống của bạn dễ dàng hơn với 'dict môi trường' của bạn không phải là ở thư mục gốc, như vậy:

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 

Sau đó, bạn sẽ có thể sử dụng {{app_environments[app_env].app_a.db_host}} hoặc {{app_environments[app_env]['app_a']['db_host']}} ở mọi nơi (mẫu Jinja, công việc).

Coi chừng quá nhiều "làm tổ" mặc dù!

Các vấn đề liên quan