ansible中include_tasks和import_tasks

By | 2021年10月15日
目录
[隐藏]

简介

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

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

这时我们可以将这些task分解到很多文件中,通过include_tasks和import_tasks方法进行task之间的调用,说直白点这两个方法作用就是连接不同文件里的task。

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

区别一

  • import_tasks(Static)方法会在playbooks解析阶段将父task变量和子task变量全部读取并加载
  • include_tasks(Dynamic)方法则是在执行play之前才会加载自己变量

可能有点懵,举例说明

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

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

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

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

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

我们发现自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

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注