【Ansible】希望使用jinja2的loop.index,而不使用template模块
首先
<版本>
Ansible 2.9.1
Jinja2 2.11
在Jinja2中,使用for循环时存在一个变量loop.index来表示当前是第几次循环。
在Ansible中,可以使用模板模块来使用这个变量,
我们来讨论一下是否有方法可以不使用这个模块而使用loop.index。
{% set list_sample = ['a', 'b', 'c'] %}
{% for tmp in list_sample %}
{{ loop.index }}: {{ tmp }}
{% endfor %}
1: a
2: b
3: c
介绍Playbook
看到Ansible文档,似乎从Ansible2.8版本开始,`loop.index`成为了`loop`扩展功能可用的一部分。然而,变量名称在`jinja2`和`Ansible`之间是不同的。
jinja2: `loop.index`
Ansible: `ansible_loop.index`
此外,要使用`loop_control`扩展功能,必须声明才不会发生错误,所以请注意。
---
- name: "loop test"
hosts: localhost
gather_facts: no
vars:
list_sample:
- a
- b
- c
tasks:
- name: "debug loop"
debug:
msg: >-
{{ ansible_loop.index }}: {{ item }}
loop: "{{ list_sample }}"
loop_control: # ポイント
extended: yes
执行结果
可以确认ansible_loop.index中的值已经分别被赋值为1到3,与预期一致。
[ec2-user@ip-<ip addr> ansible]$ ansible-playbook loop_test.yml
PLAY [loop test] *******************************************************************************************************
TASK [debug loop] ******************************************************************************************************
ok: [localhost] => (item=a) =>
msg: '1: a'
ok: [localhost] => (item=b) =>
msg: '2: b'
ok: [localhost] => (item=c) =>
msg: '3: c'
PLAY RECAP *************************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
请参照下文
Jinja – Jinja文档
循环 – Ansible文档