redis - ansible中的混合循环

标签 redis yaml ansible jinja2

我继承了一个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"

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

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

[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 中做起来不是很方便)?

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

最佳答案

您可以在 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

关于redis - ansible中的混合循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35483866/

相关文章:

ruby-on-rails - Sidekiq/redis 与 websocket_rails 冲突 : eventmachine not initialized: evma_connect_to_server

spring-boot - 在 Spring Boot 中生成 YAML 格式响应

python - 如何打印键 :value list from a YAML file? 中的特定值

regex - 如何在Ansible YAML文件中的字符串中转义冒号?

ansible - {{ ansible_hostname }} 在直接使用 Ansible 2.3 调用时不起作用

jinja2 - 可以使用Ansible/Jinja2整理列表列表吗?

docker - 从主机访问 Redis Docker 容器

ruby-on-rails - Heroku Puma Sidekiq 运行 167% crititcal r14 内存配额在 3 个 web dynos 上超过一位访客

redis - 从排序集中随机获取结果的子集而不是词汇? - 雷迪斯

php - Behat 3 - 将参数(从导入的文件)传递给 FeatureContext 构造函数