【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文档