ansible中include_tasks和import_tasks

简介

本文主要总结下ansible里task调用的方法有哪些和它们的主要区别html

​随着要管理的服务不断增多,咱们又没将task放到roles里,会发现playbook文件愈来愈大,内容也愈来愈多,管理起来也很复杂。app

这时咱们能够将这些task分解到不少文件中,经过include_tasks和import_tasks方法进行task之间的调用,说直白点这两个方法做用就是链接不一样文件里的task。ide

在本篇文章里,假如task_A include task_B,那么咱们说task_A是父task,task_B是子task。ui

区别一

  • import_tasks(Static)方法会在playbooks解析阶段将父task变量和子task变量所有读取并加载
  • include_tasks(Dynamic)方法则是在执行play以前才会加载本身变量

可能有点懵,举例说明spa

下面两个例子是test.yml里的task调用test2.yml,不一样之处是一个使用import_tasks另外一个使用include_tasks 3d

import_tasks:在执行tasks以前,ansible解释器会先加载test.yml里的变量同时再加载test2.yml里的变量,那么ansible_os_family变量会有一个覆盖现象产生,最终的参数应为“BlackHat”,因此当test.yml里执行when语句时,ansible_os_family被断定为“BlackHat”,when的判断结果为false,也就不会调用test2.yml了htm

执行结果以下,test2.yml里的task都被skip了:blog

include_tasks:ansible会在彻底执行完test.yml里的task后才会加载test2.yml里的变量,因此当执行when语句时,ansible_os_family的参数应为“RedHat”,此时when语句判断结果是true,也就是test2.yml里的tasks会被执行。ip

将第一张图test.yaml里的import_tasks换成include_tasks,执行结果以下:it

咱们发现自test2.yml里的task被执行了,而且在test2.yml里ansible_os_family的参数变为了“BlackHat”。

这就是include_tasts和import_tasks方法的第一个区别。

区别二 

  • ​include_tasks方法调用的文件名称能够加变量
  • import_tasks方法调用的文件名称不能够有变量 

这个区别比较简单,直接上示例:

当调用的文件名称有变量时,使用include_tasks方法:

可以正常调用test2.yml,执行结果以下:

 

当使用import_tasks方法时,执行报错。

ansible也给出了错误缘由,当使用static include时,是不能使用变量的:

 

这就是include_tasts和import_tasks方法的第二个区别。

参考连接

  • https://docs.ansible.com/ansible/2.5/user_guide/playbooks_reuse.html#differences-between-static-and-dynamic

  • https://docs.ansible.com/ansible/2.5/user_guide/playbooks_conditionals.html#applying-when-to-roles-imports-and-includes

  

欢迎你们关注个人公众号:

相关文章
相关标签/搜索