如何在jinja2过滤器内使用嵌套

时间:2015-05-12 03:48:34

标签: python jinja2 ansible

我正在为虚拟主机编写模板文件,文件中的DNS应根据环境主机名更改。我正在尝试解决问题:

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$1 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语句来定义文件中变量的值。

2 个答案:

答案 0 :(得分:2)

因此,经过一些研究工作,我能够解决问题。我们可以

{% 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$1 permanent;
}

如果有人可以展示使用jinja2过滤器来实现这一目标,那么我们将非常感激。

答案 1 :(得分:1)

我认为没有Jinja过滤器可以在这里使用,但你可以简单地使用dict:

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$1 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

...