Ansible:特定角色和库存的变量是否可能?

时间:2013-07-29 02:08:40

标签: configuration-management ansible

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

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

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

  • 网站A
  • 网站B

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

  • vagrant 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存储在roles / sitea / vars / main.yml中,但是这个设置不考虑库存,意思是我要归结为2变量而不是4变量。

这是否可能没有模板重复或Ansible不支持这种情况呢?

2 个答案:

答案 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。