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

时间:2016-11-16 16:28:27

标签: ansible jinja2 ansible-playbook

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

默认/ 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循环时,我迭代单个字符。我尝试使用this问题的答案,但我得到的只是语法错误。什么可能有助于我的想法?

2 个答案:

答案 0 :(得分:6)

如果您希望它们成为列表,您应该将您的变量格式化为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 }}"

答案 1 :(得分:1)

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}}
然而,我还没有其他想法如何生成除康斯坦丁建议之外的IP地址列表。