gpt4 book ai didi

variables - Ansible:在循环中生成变量

转载 作者:行者123 更新时间:2023-12-03 13:46:20 25 4
gpt4 key购买 nike

在我的变量文件中,我需要定义一个列表变量,其项目具有相似的模式,并且还共享一些(冗余)信息。我不想手动输入所有这些信息,而是想在循环中生成列表变量。

例如,我有 100 台主机,主 IP 地址为 192.168.100.[1:100],每个主机都有一个额外的 IP 地址 10.0.1.[1:100]。
所有主 IP 使用相同的网关,例如 192.168.100.254,所有额外 IP 使用另一个网关,例如 10.0.1.254。

在一个任务中,我想遍历所有主机,对于每个主机,它的主IP、额外IP和网关都是需要的。我想在我的任务中使用“with_items”,所以我想要一个列表变量“IP_ADDRS”,其中每个项目都是一个如下所示的字典:

{ primary_ip: 192.168.100.x, primary_gw: 192.168.100.254, extra_ip: 10.0.1.x, extra_gw: 10.0.1.254}

而不是手动定义 IP_ADDRS:
IP_ADDRS:
- { primary_ip: 192.168.100.1, primary_gw: 192.168.100.254, extra_ip: 10.0.1.1, extra_gw: 10.0.1.254}
- { primary_ip: 192.168.100.2, primary_gw: 192.168.100.254, extra_ip: 10.0.1.2, extra_gw: 10.0.1.254}
- ...

我想以某种方式生成列表变量“IP_ADDRS”......

我尝试了 jinja2 语句,如下所示:
IP_ADDRS: >
"{% for idx in range(1, 101) %}
- { primary_ip: 192.168.100.{{ idx }}, primary_gw: 192.168.100.254, extra_ip: 10.0.1.{{ idx }}, extra_gw: 10.0.1.254 }
"{% endfor %}"

当我使用调试模块打印 IP_ADDRS 时,它确实会打印列表中的所有项目,但似乎 Ansible 没有将此变量视为列表,因此

with_items: {{ IP_ADDRS }}



不像我预期的那样工作。

jinja2 语句有什么问题,或者有没有办法达到相同的结果?

非常感谢,

/布鲁因

最佳答案

您可以定义对象的模板并在循环中使用它:

---
- hosts: localhost
gather_facts: no
vars:
ip_template:
primary_ip: "192.168.100.{{ item }}"
primary_gw: "192.168.100.254"
extra_ip: "10.0.1.{{ item }}"
extra_gw: "10.0.1.254"
tasks:
# execute single task, no need in list
- debug:
msg: "{{ ip_template }}"
with_sequence: "start=1 count=5"

# construct list
- set_fact:
ip_list: "{{ (ip_list | default([])) + [ip_template] }}"
with_sequence: "start=1 count=5"
- debug:
msg: "{{ ip_list }}"

如果你还想拥有 ip_list在您的变量中定义,您需要构建复杂的 Jinja2 语句以生成 JSON 格式的列表,而不是 YAML,就像您尝试的那样。这种字符串的小例子,里面有两个对象: '[{"ip":"192.168.0.10","gw":"192.168.0.1"},{"ip":"192.168.0.20","gw":"192.168.0.1"}]'

关于variables - Ansible:在循环中生成变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42811213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com