Доступ к вложенным переменным переменным в ansible

Вот мой файл group_vars/all:

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

Если окружение app_env должно быть рабочим, я перезаписываю это через переменные инвентаря. Таким образом, все развертывания являются поэтапными, если вы не сделаете их явным образом.

Таким образом, когда я хочу напечатать переменную в playbook, я могу сделать

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

Это работает!

Но как я могу получить доступ к переменной в другом модуле, например, lineinfile?

Некоторые примеры, которые не сработали:

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

Рабочие решения будут использовать модуль set_fact (двойные строки кода, не очень умный) или включать различные переменные файлы, в зависимости от app_env.

Но я действительно хотел бы знать, есть ли нотация для доступа к вложенным переменным переменным;)

1 ответ

Вы бы упростили свою жизнь, если бы ваша "среда обитания" не была в корне, вот так:

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

Затем вы должны быть в состоянии использовать {{app_environments[app_env].app_a.db_host}} или же {{app_environments[app_env]['app_a']['db_host']}} везде (шаблоны Jinja, задачи).

Остерегайтесь слишком много "злобности", хотя!

Другие вопросы по тегам