【问题标题】:Ansible counter loopAnsible 计数器循环
【发布时间】:2016-05-02 15:41:05
【问题描述】:

我正在尝试在 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 模板中编写这种循环?我在 ansible docs 中找到了“with_indexed_items”,但我不确定它是否适合这种情况。

【问题讨论】:

    标签: loops ansible ansible-playbook


    【解决方案1】:

    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 也有一个 index 属性(实际上是两个,一个从 0 开始,一个从 1 开始)如果您需要循环访问应用程序服务器(例如循环访问应用程序清单组中的主机) ) 你可以使用这个索引。

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

    【讨论】:

    • 谢谢@udondan!循环覆盖范围解决了这个问题。
    • 我的应用程序作为工作人员运行,我只定义了第一个要绑定的端口,工作人员逐步绑定到端口。因此,编写如下模板对我有用: upstream app { {% for number in range(app_workers) %} server 127.0.0.1:{{ app_first_port + number }} fail_timeout=0; {% endfor %} }
    【解决方案2】:

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

    看看:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 2021-09-14
      • 2015-10-12
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多