Ansible 循环遍历列表数据应使用 loop 关键字配合 {{ item }} 变量,推荐从 2.5 版本起替代 with_items;支持硬编码列表、变量引用及字典列表结构化数据,并需通过 results 属性提取注册后的单次执行结果。

在 Linux 中使用 Ansible 循环遍历列表数据,核心是用 loop 关键字配合 {{ item }} 变量,避免重复写多个相似任务。从 Ansible 2.5 开始,loop 是官方推荐方式,with_items 等旧语法虽仍可用,但已不建议新项目使用。
基础写法:直接写死列表
最常见场景是批量操作服务、包或用户。例如启动多个系统服务:
- 任务中声明
loop,值为 YAML 列表(字符串、数字均可) - 模块参数里用
{{ item }}引用当前循环项
示例:
- name: 启动关键服务ansible.builtin.service:
name: "{{ item }}"
state: started
loop:
- nginx
- crond
- sshd
进阶写法:用变量代替硬编码列表
把列表抽成变量,提升可读性和复用性。变量可定义在 vars 区、外部 vars_files,甚至 inventory 中。
- 在 play 的
vars下定义列表变量,如services: [nginx, crond] - 任务中用
loop: "{{ services }}"引用
好处是修改列表只需改一处,也方便不同环境加载不同变量文件。
处理结构化数据:遍历字典列表
当每个循环项需要多个参数(如用户名 + 组名 + shell),用字典列表更清晰:
- 列表中每个元素是一个字典,如
{name: alice, groups: wheel, shell: /bin/bash} - 在模块中通过
{{ item.name }}、{{ item.groups }}分别取值
示例(创建用户):
- name: 创建多个用户ansible.builtin.user:
name: "{{ item.name }}"
groups: "{{ item.groups }}"
shell: "{{ item.shell | default('/bin/bash') }}"
loop:
- {name: alice, groups: wheel}
- {name: bob, groups: users, shell: /bin/zsh}
注册循环结果后正确提取输出
如果任务用了 register 捕获执行结果,注意返回结构是嵌套的:
- 注册变量(如
svc_result)本身有changed、failed等顶层字段,反映整个循环任务的状态 - 真正每个项的输出在
svc_result.results这个列表里 - 要遍历每条命令的 stdout,得写
loop: "{{ svc_result.results }}",再取{{ item.stdout }}
直接对 svc_result 循环或打印 {{ item }},会得到整块结构,不是你想要的单条输出。











