如何从环境变量中获取值,但如果未设置环境变量,则使用默认值?
这是一个不起作用的例子
---
- 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)
Jinjadefault模板内置函数的最后一个参数应该是true,像这样:
vars:
build_dir: "{{ lookup('env','BUILD_DIR')|d('builds/1.0.0/LATEST', true) }}"
Run Code Online (Sandbox Code Playgroud)
发现这个比我见过的其他一些选项更简洁易读
"{{ lookup('env','BUILD_DIR') or 'builds/1.0.0/LATEST' }}"
Run Code Online (Sandbox Code Playgroud)
最好不要有太多的事实来源,但我总是尝试在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,否则“那种方式就是疯狂......”
| 归档时间: |
|
| 查看次数: |
5777 次 |
| 最近记录: |