Переменная среды по умолчанию или по умолчанию - PullRequest
0 голосов
/ 13 июня 2018

Как получить значение из переменной среды, но использовать значение по умолчанию, если переменная среды не установлена?

Это пример, который не работает

---
- name: a playbook
  hosts: all
  vars:
    build_dir: "{{ lookup('env','BUILD_DIR') | default('builds/1.0.0/LATEST') }}"
  tasks:
    - debug: msg="{{ build_dir }}"

Запуск этогоplaybook возвращает пустую строку вместо значения по умолчанию.

$ ansible-playbook build.yml

TASK [debug] ********************
ok: [amber] => {
    "msg": ""
}

Тем не менее, он работает, как и ожидалось, для получения переменной среды.

$ BUILD_DIR=LOL ansible-playbook build.yml

TASK [debug] ****************
ok: [amber] => {
    "msg": "LOL"
}

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Лучше не иметь слишком много источников правды, но я всегда стараюсь установить интеллектуальные значения по умолчанию в defaults/main.yml.Я также часто использую фильтр default(), например:

db_url          : "{{ DB_HOST }}:{{ db_port | default(1521) }}:{{ DB_SVC | default(SID|default('')) }}"

Тогда книга воспроизведения всегда может перезаписать переменную роли с помощью поиска, в котором по умолчанию используется литерал -

vars:
  db_port: "{{ lookup('env','db_port')|default('9999') }}"

или со значением, динамически записанным в файл vars_file перед началом воспроизведения, или в файл хоста или файл групп, или в командную строку ANSIB с --extra-vars и т. д.

Посмотрите на правила приоритета переменных , но будьте осторожны, чтобы не стать слишком сложным, если этого можно избежать.Гибкость - это хорошо, но ПОЦЕЛУЙ, иначе «этот путь кроется в безумии ...»

0 голосов
/ 13 июня 2018

Последний параметр встроенной функции шаблона default Джинджи должен быть true, например:

  vars:
    build_dir: "{{ lookup('env','BUILD_DIR')|d('builds/1.0.0/LATEST', true) }}"
...