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) }}
我正在使用 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) }}