Ansible:如何使用条件压缩 jinja2 模板

Ansible: how to compact jinja2 template using conditions

我正在使用 ansible 2.1。大多数网络服务器只有一个 IP,但有些服务器有两个 IP。每个网络服务器都有供内部使用的特殊网站,我有特殊变量来定义该网站使用哪个 IP:如果 INTERNALWEBSITE_LISTEN_IP 为 null - 使用主 IP,如果不是 - 来自 host_vars.[= 的自定义 IP 17=]

roles/web_std/defaults/main.yml的内容:

r_web_std:
  INTERNALWEBSITE_LISTEN_IP: null

inventory/host_vars/100.200.1.2 上的内容:

r_web_std:
  INTERNALWEBSITE_LISTEN_IP: "100.200.1.4"

(此主机有两个IP:100.200.1.2和100.200.1.4,100.200.1.2为默认IP)

这是来自server.conf.j2的片段:

DocumentRoot /www/{% if r_web_std.INTERNALWEBSITE_LISTEN_IP == null %}{{ ansible_default_ipv4.address }}{% else %}{{ r_web_std.INTERNALWEBSITE_LISTEN_IP }}{% endif %}/www
ErrorLog /var/log/httpd/{% if r_web_std.INTERNALWEBSITE_LISTEN_IP == null %}{{ ansible_default_ipv4.address }}{% else %}{{ r_web_std.INTERNALWEBSITE_LISTEN_IP }}{% endif %}/error.log
CustomLog "/var/log/httpd/{% if r_web_std.INTERNALWEBSITE_LISTEN_IP == null %}{{ ansible_default_ipv4.address }}{% else %}{{ r_web_std.INTERNALWEBSITE_LISTEN_IP }}{% endif %}/access.log" combined

我的眼睛!

是否可以简化这个?

{% if r_web_std.INTERNALWEBSITE_LISTEN_IP == null %}
{{ ansible_default_ipv4.address }}
{% else %}
{{ r_web_std.INTERNALWEBSITE_LISTEN_IP }}
{% endif %}

尝试将 roles/web_std/defaults/main.yml 更改为使用

r_web_std: INTERNALWEBSITE_LISTEN_IP: "{{ ansible_default_ipv4.address }}" 并在需要的地方使用 INTERNALWEBSITE_LISTEN_IP

我喜欢@Kyles 的方法。但为了完整起见,您还可以使用 default 过滤器:

{{ r_web_std.INTERNALWEBSITE_LISTEN_IP | default(ansible_default_ipv4.address) }}