前言很多刚接触 Ansible 的同学都会被 Play、tasks、task 这几个概念搞混为什么一个脚本里可以写多个hoststasks关键字只能写一次吗怎么一眼看出脚本里有几个 Play一、核心概念速记3 个关键结论1. 关于tasks关键字1 个 Playbook 脚本中单个 Play 只能写 1 次tasks关键字但tasks下面可以包含任意多个 task任务比如创建用户 1、用户 2、用户 3或者修改用户属性、创建文件、安装软件都可以写在同一个tasks下面按顺序执行。同一个tasks下的所有 task都属于当前这个 Play受hosts指定的目标主机限制并且任务要和hosts主机有关联性。2. 关于 Play 的识别标志判断一个 YAML 脚本里有多少个 Play看这个固定结构yaml- name: Play的名称 hosts: 目标主机/主机组 gather_facts: no # 可选配置只要出现以- name:开头、包含hosts的完整段落就算一个独立的 Play。3. 关于 Play 与 task 的关联规则同一个 Play 里的所有 task都必须和这个 Play 的hosts强关联所有任务都会在hosts指定的主机上执行不能跨主机随意写。不同的 Play 之间可以无关联可以指定不同的目标主机、不同的配置互相独立执行互不影响。二、结合实际脚本逐段拆解验证此脚本是典型的 “双 Play 多 task” 结构脚本完整示例yaml--- # 第一个 Play创建两个用户2个任务关闭信息收集 - name: Create two normal users hosts: test01 gather_facts: no # 关闭被控端信息收集 tasks: # 任务1创建 admin01 - name: Create user admin01 ansible.builtin.user: name: admin01 state: present # 任务2创建 admin02 - name: Create user admin02 ansible.builtin.user: name: admin02 state: present # 第二个 Play修改其中一个用户 Shell/bin/sh - name: Modify user login shell hosts: test01 gather_facts: no tasks: - name: Change admin01 shell to /bin/sh ansible.builtin.user: name: admin01 shell: /bin/sh state: present1. 第一个 Play 拆解验证规则 1 和规则 3yaml# 第一个 Play 开始Play识别标志 - name: Create two normal users hosts: test01 # 目标主机为 test01 gather_facts: no tasks: # 整个Play只写了1次tasks关键字 # task任务1创建 admin01属于当前Play在test01上执行 - name: Create user admin01 ansible.builtin.user: name: admin01 state: present # task任务2创建 admin02同样属于当前Play在test01上执行 - name: Create user admin02 ansible.builtin.user: name: admin02 state: present验证规则 1这个 Play 里只有 1 个tasks但包含 2 个 task完全符合规范。验证规则 3两个任务都和hosts: test01关联只会在 test01 上执行。2. 第二个 Play 拆解验证规则 2 和规则 3yaml# 第二个 Play 开始新的Play识别标志 - name: Modify user login shell hosts: test01 # 同样指定目标主机为 test01也可以换成其他主机 gather_facts: no tasks: - name: Change admin01 shell to /bin/sh ansible.builtin.user: name: admin01 shell: /bin/sh state: present验证规则 2这是一个新的 Play有独立的- name:和hosts结构所以是第二个 Play。验证规则 3这个 Play 的任务和第一个 Play 互相独立即使目标主机都是 test01也可以分开配置、分开执行。三、常见误区避坑写博客必加误区 1一个 Play 里写多个tasks❌ 错误写法yaml- name: 错误示例 hosts: test01 gather_facts: no tasks: - name: 任务1 user: name: admin01 state: present tasks: # 错误同一个Play里重复写了tasks关键字 - name: 任务2 user: name: admin02 state: present✅正确写法一个 Play 只写 1 次tasks所有任务缩进对齐即可。误区 2把不同主机的任务写在同一个 Play 里❌ 错误写法yaml- name: 错误示例 hosts: test01 gather_facts: no tasks: - name: 在test01创建用户 user: name: admin01 state: present - name: 在test02创建用户 # 错误同一个Play的hosts是test01不能直接跨主机 user: name: admin02 state: present✅正确写法跨主机的任务拆分到不同的 Play 里每个 Play 指定自己的hosts。四、知识点总结可直接复制到博客末尾tasks关键字单个 Play 中只能出现 1 次下方可包含任意多个 task任务按顺序执行。Play 的识别标志以- name:开头、包含hosts的完整段落就是一个独立的 Play。关联规则同一个 Play 内的所有 task都和当前 Play 的hosts强关联不同 Play 之间互相独立可指定不同的目标主机。