Ansible环境变量或默认值

时间:2018-06-13 14:49:35

标签: ansible jinja2

如何从环境变量中获取值,但如果未设置环境变量,则使用默认值?

这是一个不起作用的例子

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

3 个答案:

答案 0 :(得分:4)

发现此内容比我见过的其他一些选项更简洁,更易于阅读

"{{ lookup('env','BUILD_DIR') or 'builds/1.0.0/LATEST' }}"

答案 1 :(得分:3)

Jinja的default模板内置函数的最后一个参数应为true,如下所示:

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

答案 2 :(得分:1)

最好不要有太多的事实来源,但我总是尝试在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的值,或者在hosts文件或组文件中,或者在带有--extra-vars的ansible命令行中等等。

查看variable precedence rules,但如果可以避免,请注意不要过于复杂。灵活性很好,但KISS,“其他方式就是疯狂......”