请看这个工作游戏示例:
- name: Display the URL
hosts: all
gather_facts: false
vars:
- host_domain: "testing.example.com"
- default_url: "http://def.localhost.{{ host_domain }}"
- my_url: "{{ some_undeclared_var | default(default_url) }}"
tasks:
- debug:
msg: "{{ my_url }}"
这很好。输出符合预期:
msg: http://def.localhost.testing.example.com
我想在不先声明变量的情况下以内联方式设置默认值default_url
。如下所示:
vars:
- host_domain: "testing.example.com"
- my_url: "{{ some_undeclared_var | default('http://def.localhost.{{ host_domain }}') }}"
我尝试过不同的技巧:
my_url: "{{ some_undeclared_var | default(\'http://def.localhost.{{ host_domain }}\') }}"
my_url: "{{ some_undeclared_var | default(\"http://def.localhost.{{ host_domain }}\") }}"
my_url: "{{ some_undeclared_var | default('http://def.localhost.'{{ host_domain }}) }}"
my_url: "{{ some_undeclared_var | default('http://def.localhost.'host_domain) }}"
我似乎搞不懂这个语法。有人能帮忙吗?
答案1
您永远不需要嵌套{{...}}
模板标记。在 Jinja 模板上下文中,只需使用常规 Jinja 语法来引用变量。请参阅文档了解详情。
因此,不要:
vars:
- host_domain: "testing.example.com"
- my_url: "{{ some_undeclared_var | default('http://def.localhost.{{ host_domain }}') }}"
你会写:
vars:
- host_domain: "testing.example.com"
- my_url: "{{ some_undeclared_var | default('http://def.localhost.{}'.format(host_domain)) }}"
这是一个可运行的示例:
- hosts: localhost
gather_facts: false
vars:
- host_domain: "testing.example.com"
- my_url: "{{ some_undeclared_var | default('http://def.localhost.{}'.format(host_domain)) }}"
tasks:
- debug:
msg: "{{ my_url }}"
输出:
TASK [debug] *******************************************************************
ok: [localhost] => {
"msg": "http://def.localhost.testing.example.com"
}
您还可以写default('http://def.localhost.%s' % (host_domain))
(使用%
-style 格式),或default('http://def.localhost.' ~ host_domain)
(使用字符串连接运算符)。
答案2
这有效:
my_url: "{{ some_undeclared_var | default('http://def.localhost.' + host_domain) }}"
(连接字符串)