使用 jinja 模板中的给定范围在 ansible 中创建 ip 列表

Creating list of ip's in ansible using given range within jinja template

我想在 defaults/main.yml 中生成一个 IP 地址列表(使用最后 8 位的范围,因此 120-190 转换为 x.x.x.120 - x.x.x.190)在我的角色中,稍后使用它来创建新的网络接口并生成新的配置文件。我试过这种方法:

defaults/main.yml:

ip_list: "{%for address_end in range(50,99)%} 192.168.0.{{address_end}}{%endfor%}" conf_list: "{%for ip in ip_list%}server {{ip}}:6666 {%endfor%}"

然后在模板中使用它

template.conf.j2:

{% for conf_line in conf_list %}
{{conf_line}}
{% endfor %}

我在生成的配置文件中得到的是:

            s
            e
            r
            v
            e
            r


            :
            6
            6
            6
            6

            s
            e
            r
            v
            e
            r

            1
            :
            6

所以我的猜测是我不是在生成列表,而是生成一个长字符串,当我在 template.conf.j2 中使用 for 循环时,我迭代了单个字符。我尝试使用 问题的答案,但我得到的只是语法错误。有什么想法可以帮助我吗?

如果您想让变量成为列表,您应该将它们格式化为 JSON 列表。
1.1.1.1 2.2.2.2 3.3.3.3 是一个字符串。
['1.1.1.1', '2.2.2.2', '3.3.3.3'] 将转换为列表。

但是还有其他方法适合您:

ip_list: "{{ lookup('sequence', 'start=50 count=12 format=192.168.0.%d', wantlist=True) }}"
conf_list: "{{ ip_list | map('regex_replace','(.*)','server \1:6666') | list }}"

Kostantin 的回答很有帮助,但我发现在我的案例中生成配置条目可以用一种不太复杂的方式来解决。而不是像 :

那样尝试遍历 jinja 模板文件 template.conf.j2 中的列表或字符串变量变量
{% for conf_line in conf_list %}
{{conf_line}}
{% endfor %}

您可以在 defaults/main.yml:

中生成字符串时输入插入新行符号
conf_list: "{%for ip in ip_list%}server {{ip}}:6666\n{%endfor%}"

然后将整个字符串插入 template.conf.j2,如下所示:

{{conf_line}}

尽管如此,除了 Konstantin 提议的以外,我不知道如何生成 IP 地址列表。