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

标签 ansible jinja2 ansible-playbook

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

默认值/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%}"
然后在模板中使用它

模板.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

所以我的猜测是我没有生成一个列表,而只是一个长字符串,当我在 中使用 for 循环时模板.conf.j2 我遍历单个字符。我尝试使用对 this 的回答问题,但我得到的只是语法错误。有什么想法可以帮助我吗?

最佳答案

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

关于ansible - 使用 jinja 模板中的给定范围在 ansible 中创建 ip 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40637270/

相关文章:

python - 如何在 HTML 中嵌入 python 文件或代码?

ansible - 如何循环 Ansible 变量名称

javascript - 使用FLASK时使用JS函数更改背景图像

yaml - Ansible lineinfile insertafter 在文件末尾注入(inject)行

ansible - 如何使用ansible遍历文件中的每一行?

linux - 如何使用 Ansible playbook 创建具有更改所有权的目录结构

Ansible:从环境变量中的路径复制文件

ansible - 不同环境的独立 Ansible Vaults?

linux - Ansible 任务写入本地日志文件

linux - 当条件处于ansible状态时