2016-06-17 53 views
2

我正在使用2.1。大多數網絡服務器只有一個IP,但有些服務器有兩個IP。每個網絡服務器都有專門的網站供內部使用,我有一個特殊的變量來定義這個網站使用哪個IP:如果INTERNALWEBSITE_LISTEN_IP爲空 - 使用主要IP,如果不是 - 從host_vars定製IP。Ansible:如何使用條件壓縮jinja2模板

內容的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 %} 

回答

2

嘗試改變roles/web_std/defaults/main.yml使用

r_web_std: INTERNALWEBSITE_LISTEN_IP: "{{ ansible_default_ipv4.address }}" ,只是使用INTERNALWEBSITE_LISTEN_IP無處不需要它?

1

我喜歡@Kyles的做法。但爲了完整性,您還可以使用default過濾器:

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