一、为什么大剧本需要拆分

原始笔记把 include 文件包含放在 Jinja2 之后介绍,但它本质上解决的是另一个问题:

  • 剧本越来越大,不容易阅读
  • 一个剧本中混杂多个主机组和多个步骤,可读性变差
  • 调试和维护成本越来越高

这在真实环境里非常常见。尤其当同一个服务既有服务端任务,又有客户端任务时,剧本很容易膨胀。

二、include_tasks 想解决什么问题

原始笔记中明确给出的思路是:

  • 把一个大的剧本拆成多个小剧本
  • 再通过 include_tasks 把这些小剧本组合起来使用

这带来的好处主要有:

  • 阅读更清晰
  • 调试更方便
  • 后续修改某一部分时影响范围更小

三、这个案例为什么选择 NFS

原始笔记仍然沿用了前面 NFS 部署案例,因为它天然包含两类任务:

  • NFS 服务端部署
  • NFS 客户端部署

这正好适合演示“拆分为多个任务文件”的效果。

四、拆分后的剧本结构长什么样

原始笔记把整个 NFS 部署剧本拆成了三部分:

  • 18-1.deploy-nfs-server.yml:服务端任务
  • 18-2.deploy-nfs-client.yml:客户端任务
  • 18-3.deploy-nfs-all.yml:总剧本,负责引入前两个文件

这是一种非常典型的组织方式:

  • 任务逻辑分开
  • 编排入口保留一个总文件

五、服务端任务文件怎么写

原始笔记中的服务端子剧本如下:

- name: 01. 部署nfs-utils, rpcbind
  yum:
    name: nfs-utils,rpcbind
    state: present
  tags:
    - 01.install
- name: 02. 修改配置文件
  lineinfile:
    path: /etc/exports
    line: "/backup-nfs 192.168.1.0/24(rw,all_squash)"
    create: true
  tags:
    - 02.conf
- name: 03. 创建共享目录并更改所有者
  file:
    path: /backup-nfs
    owner: nfsnobody
    group: nfsnobody
    state: directory
  tags:
    - 03.dir
- name: 04. 启动服务rpcbind, nfs(注意顺序)
  systemd:
    name: "{{ item }}"
    enabled: yes
    state: started
  loop:
    - rpcbind
    - nfs
  tags:
    - 04.start_service

注意这里的内容是“任务列表”,而不是完整 Play,因为它后面会被总剧本包含进来。

六、客户端任务文件怎么写

原始笔记中的客户端子剧本如下:

- name: 01. 部署nfs-utils
  yum:
    name: nfs-utils
    state: present
- name: 02. 挂载nfs
  mount:
    src: 192.168.1.22:/backup-nfs
    path: /ans-upload
    fstype: nfs
    state: mounted

和服务端文件一样,它也是纯任务片段,准备被上层剧本引用。

七、总剧本如何组合多个子文件

原始笔记中的总剧本如下:

- hosts: nfs
  tasks:
    - include_tasks: 18-1.deploy-nfs-server.yml

- hosts: web
  tasks:
    - include_tasks: 18-2.deploy-nfs-client.yml

这里的关键点在于:

  • 总剧本仍然负责定义 hosts
  • 具体任务则拆分到独立文件中

这样剧本结构就从“一个大文件”变成了“一个入口 + 多个子任务文件”。

八、这种拆分方式的实际价值是什么

通过这个案例,可以明显看出 include_tasks 的几个优点:

8.1 可读性提升

服务端和客户端逻辑彻底分开后,阅读时不会互相干扰。

8.2 维护更清晰

如果以后只改 NFS 服务端逻辑,只需要修改:

  • 18-1.deploy-nfs-server.yml

而不会影响客户端部分。

8.3 更适合团队协作

当剧本规模变大时,不同人可以分别维护不同文件,比所有人都改同一个大文件更安全。

九、如何验证拆分后的剧本

原始笔记中使用了模拟执行:

ansible-playbook -C 18-3.deploy-nfs-all.yml

这说明拆分后仍然推荐:

  • 先用检查模式验证整体组合是否正确

如果总剧本能够顺利加载并显示对应任务,说明 include_tasks 的组织方式已经生效。

十、小结

include_tasks 的价值,不在于“语法本身有多复杂”,而在于它能帮你把越来越大的剧本拆成更容易维护的结构。

可以把它的使用场景总结成一句话:

  • 当一个服务的部署任务越来越多、主机角色越来越复杂时,就该考虑拆分。

对于中大型 Ansible 项目来说,这种“总剧本 + 子任务文件”的组织方式几乎是走向规范化维护的必经之路。