【问题标题】:How to add up variables of different hosts in Ansible如何在 Ansible 中添加不同主机的变量
【发布时间】:2021-08-23 16:47:26
【问题描述】:

我有类似以下的情况:

all:
  hosts:
    host1:
      num: 3

    host2:
      num: 4

    host3:
      num: 2

我想将一个文件模板化到主机,该文件应该从 1 开始在每个主机上逐步聚合值 num

例如对于 host1,新变量/文件的内容 from 应该是 1,对于 host2 它应该是 4 (1+3),对于 host3 8 (4+4)。但执行顺序并不重要——它也可能是:host3 1、host1 3 (1+2)、host2 6 (3+3)。所以变量num 基本上说明了主机将处理多少项目,我的问题的目标是给每个主机一个专用的数字范围,即[from,from+num-1]

编辑:我已经进一步考虑过,这也可以预先计算。基本上我想从 [3,4,2] 到 [0,3,7](或 [1,4,8])。很遗憾,我找不到可以执行此操作的 Jinja2 过滤器。

【问题讨论】:

  • 也许你可以使用事实委托docs.ansible.com/ansible/latest/user_guide/…
  • 不知道如何获取Ordering execution based on inventory排序的主机列表。恐怕这是不可能的。如果是这样,您的问题将无法解决。当然,您可以使用递增的值创建列表或字典。但是,您永远无法确定主机的顺序。
  • @VladimirBotka 实际上这与执行顺序无关,它可以是主机同意的任何顺序。所以这也可以在控制器机器上预先计算。基本上我只想将数组 [a,b,c] 减少/映射到 [1, a+1, a+b+1]。
  • 在这种情况下,您可能还想“减少”问题。

标签: ansible


【解决方案1】:

问:"将数组 [a,b,c] 减少/映射到 [1, a+1, a+b+1]"

答:map 不会附加地应用过滤器。恐怕需要迭代。例如,给定列表

l: [10, 20, 30]

创建项目并连接新列表

    - set_fact:
        l2: "{{ l2|d([]) + [l[0:(item)]|sum + 1] }}"
      loop: "{{ range(0, l|length) }}"

给予

  l2:
  - 1
  - 11
  - 31

当然,如果你想一步减少列表,你可以写一个过滤器。

【讨论】:

  • 非常感谢!作为一个 Ansible/Jinja2-Beginner,我可能需要几个小时才能提出这个解决方案......我并没有将我的问题“减少”到只有这个,因为我还想包括在我的单独主机上使用结果的方面,我也在为此苦苦挣扎。你能指出我需要去这里的方向吗?也许我可以从类似地图的对象 [{1.1.1.1: 10}, {2.2.2.2: 20}, {3.3.3.3: 30}] 开始,然后将其转换为 [{1.1.1.1: 1}, { 2.2.2.2: 11}, {3.3.3.3: 31}] 就像我们对列表所做的那样。然后我想我可以访问每个主机的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多