假设我有一个从模板创建的nginx配置文件,我用它来配置某些主机,将服务器名称从http重定向到https:
server {
listen 80;
server_name {{ server_name }};
rewrite ^ https://$server_name$request_uri? permanent;
}
假设我在同一台机器上托管了两个网站:
每个都有自己的服务器名称,每个都需要上面的重定向。同时,假设我至少有两个单独的部署配置,每个配置由其自己的库存文件及其group_vars /文件夹表示,例如:
每个使用不同的服务器名称。所以现在我有2 * 2 = 4个独立的服务器名称:
我无法弄清楚如何定义所有这4个变量。我无法在group_vars /下定义两个单独的变量,因为j2模板只需要一个变量名{{server_name}},所以我必须定义两次相同的模板才能使其工作。
另一种选择是将sitea和siteb作为两个单独的角色(我还是会这样做),并将sever_name存储在roles / sitea / vars / main.yml中,但是这个设置不考虑库存,意思是我要归结为2变量而不是4变量。
这是否可能没有模板重复或Ansible不支持这种情况呢?
答案 0 :(得分:1)
如果您要将它们分成两个角色,请在广告资源中定义网站名称并将其作为角色参数传递:
roles:
- { role: sitea, server_name: "{{ sitea_server_name }}" }
- { role: siteb, server_name: "{{ siteb_server_name }}" }
答案 1 :(得分: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。