如何在 jinja2 过滤器中使用嵌套 if

How to use nested if inside jinja2 filter

我正在为虚拟主机编写模板文件,文件中的 DNS 应根据环境主机进行更改-name.Below 是我正在尝试解决的问题:

server {
    listen 80;
    charset utf-8;
    server_name "{{ 'a.com if ansible_hostname='p.com' 'b.com' if   ansible_hostname= 'd.com' 'z.com' if ansible hostname is 'k.com' else 'default.com' }}";
    rewrite ^(.*)  https://$server_name permanent;
}

我怎样才能在模板中实现这个东西,即:

{{ 'a.com' if ansible_hostname='p.com' 'b.com' if ansible_hostname= 'd.com' 'z.com' if ansible hostname is 'k.com' else 'default.com' }}" `

我是 jinja 2 的新手,不知道该怎么做。 单个 if else 语句有效,但我如何使用多个 if else 语句来定义文件中变量的值。

所以经过一些研究工作后,我能够破解 issue.We can

{% if ansible_hostname == 'a.com' %}
 {% set server = 'b.com' %}
{% elif ansible_hostname == 'c.com' %}
 {% set server = 'd.com' %}
{% else %}
 {% set server = 'define yourself' %}
{% endif %}

server {
    listen 80;
    charset utf-8;
    server_name {{ server }};
    rewrite ^(.*)  https://$server_name permanent;
}

不过,如果有人可以展示使用 jinja2 过滤器来实现这一点,那将不胜感激。

我认为 Jinja 过滤器不会在这里使用,但您可以简单地使用字典来完成:

server {
    listen 80;
    charset utf-8;
    server_name {{ {"a.com": "b.com", "c.com": "d.com"}[ansible_hostname] | default("default.com") }};
    rewrite ^(.*)  https://$server_name permanent;
}

这可能适用于 2 个或更多主机,但随着数量的增加很快就会变脏。总的来说,我认为如果这样的决定不会发生在模板文件中会更干净。这也可以是 host_vars 或 group_vars 中的配置选项。为了与您的示例主机保持一致,您可以拥有一个包含内容

的文件 host_vars/a.com
---

server: b.com

...

和一个包含内容

的文件host_vars/c.com
---

server: d.com

...

在文件中group_vars/all您可以定义默认值。

---

server: default.com

...