jinja2 中的 for 循环

jinja2 中的 for 循环

请向我解释一下如何解决这个问题?我有这个文件defaults/main.yml

---
node1:
 ip: 1.1.1.1

node2:
 ip: 2.2.2.2

node3:
 ip: 3.3.3.3 

现在,我想在模板文件中ip.j2访问for loop每个服务器的IP并保存在address variable

像这样:

address= 1.1.1.1,2.2.2.2,3.3.3.3

我尝试了这段代码:

address={% for x in {{nubmer_nodes}} %}
{{node[x].ip}}
{% if loop.last %},{% endif %}
{% endfor %}

但出现错误。我该怎么做?

错误:

TASK [Gathering Facts] *********************************************************************

ok: [db2]
ok: [db3]
ok: [db1]

TASK [ssh : -- my loop --] *************************************************************************

fatal: [db1]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
fatal: [db2]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
fatal: [db3]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token ':', got '}'. String: \r\naddress={% for x in {{number_nodes}} %}\r\n{{node[x].ip}}\r\n{% if loop.last %},{% endif %}\r\n{% endfor %}"}
        to retry, use: --limit @/etc/ansible/playbooks/get_ip_ssh.retry

PLAY RECAP ********************************************************

db1                        : ok=1    changed=0    unreachable=0    failed=1
db2                        : ok=1    changed=0    unreachable=0    failed=1
db3                        : ok=1    changed=0    unreachable=0    failed=1

编辑-1

我更改了templatedefault/main.yml代码。我有名称(节点),但我还无法访问 IP default/main.yml。:

nodes:
 node1:
     ip: 1.1.1.1

 node2:
     ip: 2.2.2.2

 node3:
     ip: 3.3.3.3

get-ip.j2

address={% for host in nodes %}{{host}}{% if not loop.last %},{% endif %}{% endfor %}

输出是:

address=node1,node3,node2

我也使用了这段代码:

address={% for host in nodes %}{{host.ip}}{% if not loop.last %},{% endif %}{% endfor %}

或者

address={% for host in nodes %}{{host.[ip]}}{% if not loop.last %},{% endif %}{% endfor %}

但还没有工作!!

更新

我的问题解决了,我使用这段代码:

address={% for host in nodes %}{{ nodes[host].ip }}{% if not loop.last %},{% endif %}{% endfor %}

答案1

一些东西。

首先,假设number_nodes值为 1,2,3,您尝试访问 的元素node,但在提供的 yaml 中没有这样的变量。

其次,您不能以这种方式迭代三个不同的变量。

但是,如果您的 yaml 文件如下所示:

---
nodes:
  - ip: 1.1.1.1
  - ip: 2.2.2.2
  - ip: 3.3.3.3 

您的代码可能如下所示:

address={% for x in {{ nodes }} %}
{{ x.ip }}
{% if not loop.last %},{% endif %}
{% endfor %}

与您的代码不同的是:

  • 在第一行中,我们循环遍历 的元素nodes
  • 在第二个中,您选择ip的元素x,它是循环中的每个元素。
  • 在第三行中,假设您希望除最后一个元素之外的所有元素之间都使用逗号,则需要一个not.

相关内容