本文主要总结下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_tasksimport_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-dynamichttps://docs.ansible.com/ansible/2.5/user_guide/playbooks_conditionals.html#applying-when-to-roles-imports-and-includes