使用include还是import?
将各类文件分类存放后,最终需要在某个入口文件去汇集引入这些外部文件。加载这些外部文件通常可以使用include指令、include_xxx指令和import_xxx指令,其中xxx表示内容类型。
在早期Ansible版本,组织文件的方式均使用include指令,但随着版本的更迭,Ansible对这方面做了更为细致的区分。虽然目前仍然支持include,但早已纳入废弃的计划,所以现在不要再使用include指令,在后文中我也不会使用include指令。
对于playbook(或play)或task,可以使用include_xxx或import_xxx指令:
- (1).include_tasks和import_tasks用于引入外部任务文件;
- (2).import_playbook用于引入playbook文件;
- (3).include可用于引入几乎所有内容文件,但建议不要使用它;
对于handler,因为它本身也是task,所以它也能使用include_tasks、import_tasks来引入,但是这并不是想象中那么简单,后文再细说。
对于variable,使用include_vars(这是核心模块提供的功能)或其它组织方式(如vars_files),没有对应的import_vars。
对于后文要介绍的Role,使用include_role或import_role或roles指令。
既然某类内容文件既可以使用include_xxx引入,也可以使用import_xxx引入,对于我们来说,就有必要去搞清楚它们有什么区别。本文最后我会详细解释它们,现在我先把结论写在这:
- (1).
include_xxx指令是在遇到它的时候才加载文件并解析执行,所以它是动态解析的; - (2).
import_xxx是在解析playbook的时候解析的,也就是说在执行playbook之前就已经解析好了,所以它也称为静态加载。
include和import 引入 举例
用示例来解释会非常简单。假设,两个playbook文件pb1.yml和pb2.yml。
pb1.yml文件内容如下:
---
- name: play1
hosts: localhost
gather_facts: false
tasks:
- name: task1 in play1
debug:
msg: "task1 in play1"
# - include_tasks: pb2.yml
- import_tasks: pb2.yml
pb2.yml文件内容如下:
- name: task2 in play1
debug:
msg: "task2 in play1"
- name: task3 in play1
debug:
msg: "task3 in play1"
执行pb1.yml:
$ ansible-playbook pb1.yml
上面是在pb1.yml文件中通过import_tasks引入了额外的任务文件pb2.yml,对于此处来说,将import_tasks替换成include_tasks也能正确工作,不会有任何影响。
但如果是在循环中(比如loop),则只能使用include_tasks而不能再使用import_tasks。