1

假设我有一个从模板创建的 nginx 配置文件,我用它来配置某些主机以将服务器名称从 http 重定向到 https:

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

假设我在同一台机器上托管了两个网站:

  • 站点 A
  • 站点 B

每个都有自己的服务器名称,每个都需要上面的重定向。同时假设我至少有两个单独的部署配置,每个配置都由其自己的清单文件及其 group_vars/ 文件夹表示,例如:

  • 流浪的单盒
  • 生产

每个使用不同的服务器名称。所以现在我有 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存储在roles/sitea/vars/main.yml中,但是该设置不考虑库存,这意味着我会减少到 2 个变量而不是 4 个。

如果没有模板重复,这是否可能,或者 Ansible 还不支持这种场景?

4

2 回答 2

1

如果您无论如何要将它们分成两个角色,请在清单中定义站点名称并将它们作为角色参数传递:

    roles:
       - { role: sitea, server_name: "{{ sitea_server_name }}" }
       - { role: siteb, server_name: "{{ siteb_server_name }}" }
于 2014-06-08T11:51:10.750 回答
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 address 和 current_host ip address 相同,则将 inventory_hostname 添加到 nginx 配置文件中。即使不是这种方式,您也可以通过使用hostvars.

于 2013-07-29T16:05:25.540 回答