如何在Ansible嵌套循环中获取第二个列表的枚举索引?
在Ansible中实现嵌套循环并获取第二个列表的本地索引(每个用户重置计数)
你想要的是每个用户对应的VM索引从0开始计数,完全对应Python里嵌套enumerate的逻辑对吧?这里有两种靠谱的实现方式:
方法1:提前对VM列表用enumerate生成带索引的元组
这种方法最贴近你想要的Python写法,先把vms_per_user转换成包含「索引+元素」的元组列表,再和用户列表做笛卡尔积,这样就能直接提取每个用户下的VM本地索引:
- name: Add hosts to inventory with per-user VM index add_host: name: "{{ '%s-%02d-%02d' | format(vm_prefix, item.0, item.1.0) }}" groups: vms vm_index: "{{ item.1.0 }}" # 这就是当前用户下的VM索引,从0开始 loop: "{{ userlist | product(vms_per_user | enumerate) | list }}"
细节说明:
vms_per_user | enumerate会把原列表里的每个VM元素转成(索引, 元素)的元组,比如原列表是[{number:1}, {number:2}, {number:3}],处理后变成[(0, {number:1}), (1, {number:2}), (2, {number:3})]- 和
userlist做product之后,每个item的结构是(用户, (VM索引, VM元素)),所以item.1.0就是当前用户对应的VM索引,完全实现了每个用户从0开始计数的需求。 - 如果需要用到VM元素的属性(比如你的
number字段),直接用item.1.1.number就能获取。
方法2:通过全局循环索引计算本地索引
如果你不想修改原有的product结构,也可以通过全局循环索引取模来计算每个用户内的VM索引:
- name: Add hosts to inventory with calculated per-user VM index add_host: name: "{{ '%s-%02d-%02d' | format(vm_prefix, item.0, item.1.number) }}" groups: vms vm_index: "{{ loop.index0 % vms_count }}" loop: "{{ userlist | product(vms_per_user) | list }}" vars: vms_count: "{{ vms_per_user | length }}"
细节说明:
loop.index0是Ansible提供的全局循环索引(从0开始)vms_count是每个用户对应的VM数量,也就是vms_per_user的长度- 用
loop.index0 % vms_count可以让索引在每个用户的VM范围内循环,实现每个用户重置索引的效果。
不过这种方法依赖于所有用户的VM数量相同(也就是vms_per_user的长度固定),如果你的场景中不同用户的VM数量可能不一样,方法1会更可靠灵活。
内容的提问来源于stack exchange,提问作者Bogd
相关产品推荐
相关产品推荐

