2013-07-29 36 views
1

比方說,我有一個模板,我用它來配置特定的主機到服務器名稱從HTTP重定向到https創建一個nginx的配置文件:Ansible:特定角色和庫存的變量是否可能?

server { 
    listen    80; 
    server_name   {{ server_name }}; 
    rewrite    ^https://$server_name$request_uri? permanent; 
} 

說我有託管在同一臺機器上的兩個網站:

  • 站點A
  • 站點B

每個人都有自己的服務器名稱和每個需要上面的重定向。與此同時,讓我們說,我至少有兩個獨立的部署配置,按照各自的清單文件及其group_vars /文件夾中表示,例如:

  • 流浪漢的onebox
  • 生產

各使用不同的服務器名稱。所以現在我有2 * 2 = 4個獨立的服務器名稱:

  • sitea.myonebox.com
  • siteb.myonebox.com
  • sitea.production.com
  • siteb.production.com

我不知道如何定義所有這4個變量。我無法在group_vars /下定義兩個單獨的變量,因爲j2模板只需要一個變量名{{server_name}},所以我必須定義相同的模板兩次才能完成此工作。

另一種選擇是將sitea和siteb作爲兩個獨立的角色(我打算這麼做),並將sever_name存儲在角色/ sitea/vars/main.yml中,但該設置不考慮庫存,這意味着我會下降到2個變量,而不是4個。

這是可能的,沒有模板重複,或者Ansible不支持這種情況?

回答

0

試試這個如何。這可能不是你所期望的答案。

:nginx.j2

server { 
    listen    80; 
    server_name   {% for host in groups['all'] -%} 
{% if hostvars[host]['ansible_eth0']['ipv4']['address'] == ansible_eth0['ipv4']['address'] %} 
{{ hostvars[host]['inventory_hostname'] }} {% endif %}{% endfor %} ; 
    rewrite    ^https://$server_name$request_uri? permanent; 
} 

此模板將檢查所有主機。如果group_host ip地址和current_host ip地址相同,請將inventory_hostname添加到nginx配置文件。 即使不是這種方式,也可以使用hostvars來獲取其他組或主機中的inventory_hostoname。

1

如果你要去反正他們分開兩個角色,在庫存定義站點名稱,並通過他們的角色參數:

roles: 
     - { role: sitea, server_name: "{{ sitea_server_name }}" } 
     - { role: siteb, server_name: "{{ siteb_server_name }}" } 
+0

Ansible 1.8.2:'錯誤:語法錯誤而載入YAML script' – user272735

+0

正確的語法似乎是:' - {role:sitea,server_name:「{{sitea_server_name}}」}' – user272735

+0

您是對的,已修復 – hkariti

相關問題