在 Ansible 中使用带引号的字符串内的变量

在 Ansible 中使用带引号的字符串内的变量

请看这个工作游戏示例:

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

(连接字符串)

相关内容