Ansible 中动态包含任务用 include_tasks,运行时加载支持变量、条件和循环;文件须为纯任务列表;支持 Jinja2 变量实现动态文件名;但不可用于 notify、--start-at-task 或 handlers;需静态导入时应改用 import_tasks。

在 Ansible 中动态包含任务文件,主要使用 include_tasks 指令,它会在运行时(play 执行过程中)加载并处理任务文件,支持变量、条件和循环等运行期特性。
动态包含的基本写法
用法很简单:
- 在任务列表中写:
include_tasks: filename.yml - 被包含的文件必须是一个纯任务列表(不能有
hosts、vars等 play 级字段) - 例如:
include_tasks: setup_user.yml,其中setup_user.yml内容为:
- name: Create user
user:
name: "{{ username }}"
state: present
<ul><li>name: Copy SSH key
authorized_key:
user: "{{ username }}"
key: "{{ lookup('file', 'files/id_rsa.pub') }}"用变量实现动态文件名
支持 Jinja2 变量,让包含路径可变:
-
include_tasks: "{{ inventory_hostname }}.yml"—— 每台主机加载自己专属的任务文件 -
include_tasks: "os_{{ ansible_facts['distribution'] | lower }}.yml"—— 按操作系统分发不同配置 -
include_tasks: "role_{{ app_role }}.yml"—— 根据传入角色变量选择逻辑
注意事项与限制
因为是运行时处理,动态包含有几条关键约束:
- 不能在动态包含的任务里用
notify触发 handler(handler 名称需在解析期已知) -
--start-at-task无法跳转到动态包含内部的任务 -
--list-tasks和--list-tags不会显示动态包含里的任务或标签 - 不支持在
handlers块中使用include_tasks(应改用include_handler或静态方式)
替代方案:何时该用 import_tasks?
如果需要上述功能(如标签可见、支持 --start-at-task、能被 notify 引用),就该换用 import_tasks —— 它是静态导入,在 playbook 解析阶段就展开,但不支持变量文件名和运行时条件判断。


















