辨析 ansible 之 import 和 include
概括起来讲,import_tasks 是静态的,include_tasks 是动态的。(学过 C 的朋友想一下静态联编和动态联编就明白了。)
在 ansible 中二者还会有更多的一些特性。
二者都可以用来将任务导入。
在使用 import_tasks 引用变量时,要确保变量定义在 vars/vars_file或命令行中。这个属于语言细节,注意一下。
使用 set_fact 是过不去的。
when 关键字对 include_tasks 和 import_tasks 有着本质区别。这个就属于编译特性了。这个特性在 ansible 中得以展现。
当对 import_tasks 使用 when 进行条件判断时,when 对应的条件会被应用于 include 文件中的每一个任务,意思是每要执行一个任务时,都要先进行条件判断。总结起来就是顺序执行 include 文件中列出的每一个任务前,都要进行条件判断,满足条件就执行,不满足就跳过,需要多次判断。 当对 include_tasks 使用 when 进行条件判断时,when 对应的条件只应用一次,发生在是否include这个文件,若include,则执行这个include文件中所有的任务,不再进行其他判断。
相同的还有 tag,在静态联编中才会被打开。
使用 loop 或 with_items 关键字对 include 文件进行循环操作时,只能配合 include_tasks。
这个也是属于编译特性的东西,只有动态联编才能对未来传参。