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에 ip.j2접근 해서 저장해 보겠습니다.for loopaddress 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

template및 코드를 변경했습니다 default/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.

관련 정보