介绍
将多个相关的临时命令存入 playbook,更便于重复执行和审查。实用的 playbook 描述稳定的期望状态,并在每个预期目标上产生可观察的结果。
你将使用 file 和 copy 模块编写小型 YAML playbook,将其应用到两个 SSH 节点,并验证创建的文件及重复运行时零更改的结果。本实验介绍 play、任务和幂等性,暂不涉及变量、循环或角色。
用 YAML 编写 Playbook
本步骤将把你已经练习过的 file 和 copy 模块组合为可复用的 playbook。
在终端中进入项目:
cd /home/labex/project
playbook 是由 play 组成的 YAML 列表。每个 play 将主机模式与有序任务列表关联。每个任务指定模块及其参数。name 标签便于人阅读输出;标签本身不会创建配置。
YAML 使用缩进嵌套数据。请使用空格,不要使用制表符。行首的 - 开始列表项,冒号引出键的值。这里 tasks 包含两个模块任务。"0750" 等带引号的 mode 保持为权限字符串。gather_facts: false 跳过自动事实收集,因为这些固定状态任务不使用事实。
按此前练习,使用带引号的 here-document 创建文件。请一直复制到最后的 EOF 行:
cat > workspace.yml <<'EOF'
- name: Prepare managed workspaces
hosts: all
gather_facts: false
tasks:
- name: Create the workspace directory
ansible.builtin.file:
path: /home/automation/workspace
state: directory
mode: "0750"
- name: Write the workspace notice
ansible.builtin.copy:
dest: /home/automation/workspace/README.txt
content: "Workspace managed by Ansible\n"
mode: "0640"
EOF
第一个任务声明目录。第二个任务使用 copy 的 content 参数直接提供字面文本,而非读取控制节点 src 文件。双引号 YAML 字符串将 \n 解释为结尾换行。固定内容使重复运行保持稳定;请勿添加变化的时间戳。
该 play 使用 hosts: all,表示提供的两个 SSH 节点。普通任务作为 automation 运行,因此无需 become 即可写入其主目录。
ansible-playbook 执行 playbook 文件。先使用 --syntax-check 验证结构,而不应用任务:
ansible-playbook workspace.yml --syntax-check
预期出现标识 playbook 的一行,且无解析错误。仅语法验证不能证明远程连通性或最终文件正确。
使用 --list-hosts 预览 play 的主机选择:
ansible-playbook workspace.yml --list-hosts
该 play 必须列出 web1 和 web2。空列表不是可用的双主机 playbook。
应用期望状态
本步骤将运行 playbook 并检查实际远程结果。
从项目中执行文件,以便选中其配置与清单:
ansible-playbook workspace.yml
Ansible 打印各 play 和任务名称,随后显示 PLAY RECAP。在全新环境中,两个任务应在每台主机上都产生更改:
web1 : ok=2 changed=2 unreachable=0 failed=0 ...
web2 : ok=2 changed=2 unreachable=0 failed=0 ...
空格和主机顺序可能不同。ok 统计成功任务,changed 统计需要更改的任务,而 unreachable/failed 都应为零。仅成功的任务名称不能证明文件字节或权限符合要求。
使用临时 command 模块调用读取各远程通知:
ansible all -m ansible.builtin.command -a 'cat /home/automation/workspace/README.txt'
两个 stdout 值均应显示 Workspace managed by Ansible。只读命令查询仍可能报告 CHANGED;playbook 的 file/copy 结果描述的是声明状态。受管目录权限为 0750,通知权限为 0640,两者均归 automation 所有。
验证幂等收敛
本步骤将重复执行 playbook,并确认匹配的状态无需额外更改。
幂等性意味着重复应用相同的期望状态,在收敛后不会产生不必要的更改。再次运行相同 playbook:
ansible-playbook workspace.yml
预期每个目标的汇总为 ok=2、changed=0、unreachable=0 和 failed=0。两个文件仍存在且正确。变化的时间戳或无条件执行的通用命令会破坏此稳定结果。
--check 请求预览:支持该模式的模块预测更改,而不应用更改。file 和 copy 均支持此流程。预览已收敛的 playbook:
ansible-playbook workspace.yml --check
预期两台主机再次为零更改。预览不能替代首次真实执行或实际状态检查。这里它确认已经创建的工作区与声明匹配。
请保留 playbook 以便将来复用。不要使用 changed_when 隐藏更改,也不要强制任务退出检查模式以制造干净的汇总;结果应反映实际匹配的状态。
总结
你用 YAML 表达了主机选择与有序模块任务,检查了语法及目标范围,并将 playbook 应用到两个真实的受管节点。实际文件状态符合要求,第二次真实运行未产生额外更改,只读检查模式也未发现待应用更改。



