Ansible计数器循环

时间:2016-05-02 15:41:05

标签: loops ansible ansible-playbook

我试图在Ansible中为负载均衡器编写一个nginx模板。如果我有5个应用程序服务器,那么上游服务器行必须写入5次,每次绑定端口增加1.像这样:

upstream app_servers {
  server 127.0.0.1:4000 fail_timeout=0;
  server 127.0.0.1:4001 fail_timeout=0;
  server 127.0.0.1:4002 fail_timeout=0;
  server 127.0.0.1:4003 fail_timeout=0;
  server 127.0.0.1:4004 fail_timeout=0;  
}

我将应用程序服务器的数量作为变量。如何在ansible模板中编写这种循环?我发现" with_indexed_items"在ansible docs中,但我不确定它是否符合这种情况。

2 个答案:

答案 0 :(得分:4)

with_indexed_items仅在您想要创建5个不同文件时才有用。由于您需要将此文件放在一个文件中,而该文件很可能是通过template task编写的,因此您可以在一个范围内循环:

upstream app_servers {
{% for number in range(5) %}
  server 127.0.0.1:400{{ number }} fail_timeout=0;
{% endfor %}
}
  

我将应用程序服务器的数量作为变量。

您可以在上面的范围定义中使用该变量range(your_variable)

如果没有改进,这显然只能工作到9,否则您将在 40010 之上创建端口。

Jinja loops也有一个索引属性(实际上有两个,一个从0开始,一个从1开始)如果你想以某种方式需要遍历应用程序服务器(例如在应用程序中循环主机)库存组)你可以使用这个索引。

upstream app_servers {
{% for something in whatever %}
  server 127.0.0.1:400{{ loop.index0 }} fail_timeout=0;
{% endfor %}
}

答案 1 :(得分:0)

您可能希望用户Jinja template并在其中添加一些逻辑来迭代一组服务器。

看看:

ansible模板模块http://docs.ansible.com/ansible/template_module.html

Jinja for loop http://jinja.pocoo.org/docs/dev/templates/