【问题标题】:Mixed cycling loops in ansibleansible中的混合循环循环
【发布时间】:2016-02-18 14:16:33
【问题描述】:

我继承了一个 ansible 角色(我无法控制它),该角色是在集群中安装 redis。

为此,我必须在硬编码的 defaults/main.yml 中提供一个看起来像这样的变量:

r_cluster:
  - "192.168.0.2:6380 192.168.0.1:6379"
  - "192.168.0.3:6380 192.168.0.2:6379"
  - "192.168.0.1:6380 192.168.0.3:6379"

所以,我的目标是构建这样一个变量,不是硬编码,而是从我的 hosts 文件中提取。

另一方面,我已经配置了我的主机组:

[mygroup]
redis1 ansible_host=192.168.0.1 ...
redis2 ansible_host=192.168.0.2 ...
redis3 ansible_host=192.168.0.3 ...

棘手的部分是用这种循环从这个组中构建一个像“r_cluster”这样的变量!

我最接近的是:

- name: define my hosts list
  set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['ansible_fqdn'] }}:6379"
  with_items: "{{groups['mygroup']}}"
  register: h_result

- name: transform it into the final r_cluster
  set_fact: r_cluster="{{ h_result.results | map(attribute='ansible_facts.h_item') | list }}"

哪个输出:

"r_cluster": [
        "192.168.0.1:6380 192.168.0.1:6379",
        "192.168.0.2:6380 192.168.0.2:6379",
        "192.168.0.3:6380 192.168.0.3:6379"
    ]

当然,IP 不会在输出中循环。

我没有找到任何“item+1”,或者循环“从第二个元素到第一个元素”,...

有没有办法做到这一点,而不是构建一个完整的算法(这在 yaml 中不太方便)?

我不认为我可以使用 {% %} 来构建代码,因为这似乎只允许在模板中,而模板在这里无关紧要,我必须构建一个变量(供合作伙伴角色使用) .

【问题讨论】:

  • 为什么要计算 IP?为什么不简单地添加另一个定义相关 IP:Port 的主机变量?这些 IP:Port-pairs 实际上是什么?那些是主从复制路径吗?
  • 每个主节点托管另一个节点的从节点。这是一个“黑匣子”:另一个合作伙伴管理 redis 集群(使用此选项),他们提供一个带有要提交的变量的 ansible 角色。我填充这些变量,并将它们发送到“ansible redis 黑盒角色”。为此,他们要求我们填写这样一个变量。
  • 是的,但是为什么你需要做类似 item+1 的事情呢?在每个主机的主机 vars 中简单地定义一个变量 slave_host。您甚至可以在您定义了 ips 的组中执行此操作。 redis1 ansible_host=192.168.0.1 slave_host=192.168.0.3。我将发布一个完整的示例作为答案,也许它会更清楚我的意思。

标签: redis yaml ansible jinja2


【解决方案1】:

您可以在 group-vars 中明确定义从节点,而不是循环访问 IP。

[mygroup]
redis1 ansible_host=192.168.0.1 slave_host=192.168.0.3
redis2 ansible_host=192.168.0.2 slave_host=192.168.0.1
redis3 ansible_host=192.168.0.3 slave_host=192.168.0.2

您可以在循环中使用此变量:

- name: define my hosts list
  set_fact: h_item="{{ hostvars[item]['ansible_fqdn'] }}:6380 {{ hostvars[item]['slave_host'] }}:6379"
  with_items: "{{groups['mygroup']}}"
  register: h_result

【讨论】:

  • 有时,其他眼睛可以通过从另一个角度看它来提供如此简单的解决方案。谢谢乌冬面!
猜你喜欢
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2022-06-10
  • 2019-01-13
  • 2010-10-24
  • 1970-01-01
相关资源
最近更新 更多