Ansible 环境变量或默认值

act*_*cay 4 jinja2 ansible

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

这是一个不起作用的例子

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

运行此剧本将返回一个空字符串而不是默认值。

$ ansible-playbook build.yml

TASK [debug] ********************
ok: [amber] => {
    "msg": ""
}
Run Code Online (Sandbox Code Playgroud)

但是,它按预期工作以获取环境变量。

$ BUILD_DIR=LOL ansible-playbook build.yml

TASK [debug] ****************
ok: [amber] => {
    "msg": "LOL"
}
Run Code Online (Sandbox Code Playgroud)

act*_*cay 6

Jinjadefault模板内置函数的最后一个参数应该是true,像这样:

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

  • 如果您正在寻找解释,我发现了这个不错的博客 [jinja2 默认过滤器](http://nikhilism.com/post/2016/understanding-ansible-jinja2-default-filter/) (2认同)

Cor*_*rey 6

发现这个比我见过的其他一些选项更简洁易读

"{{ lookup('env','BUILD_DIR') or 'builds/1.0.0/LATEST' }}"
Run Code Online (Sandbox Code Playgroud)

  • 优雅且蟒蛇风格 (2认同)

Pau*_*ges 5

最好不要有太多的事实来源,但我总是尝试在defaults/main.yml. 我也经常使用default()过滤器,如下所示:

db_url          : "{{ DB_HOST }}:{{ db_port | default(1521) }}:{{ DB_SVC | default(SID|default('')) }}"
Run Code Online (Sandbox Code Playgroud)

然后剧本总是可以使用默认为文字的查找覆盖角色的变量 -

vars:
  db_port: "{{ lookup('env','db_port')|default('9999') }}"
Run Code Online (Sandbox Code Playgroud)

或者在播放开始之前将值动态写入 vars_file 中,或者写入主机文件或组文件中,或者在 ansible 命令行中使用--extra-vars等。

查看变量优先级规则,但如果可以避免,请注意不要变得太复杂。灵活性很好,但是KISS,否则“那种方式就是疯狂......”

  • 请注意(显然在 2.5 中?)您需要将 `default()` 的第二个参数设置为 `true` [如果它评估为空字符串](https://docs.ansible.com/ansible/2.5/user_guide/ playbooks_filters.html#defaulting-undefined-variables)。 (2认同)