简介

本文主要总结下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

欢迎大家关注我的公众号:

ansible中include_tasks和import_tasks的更多相关文章

  1. ansible中的map

    ansible中的filter:   map  ,其实是jinja2中的filter python中 map(func, iter) 返回func与每个元素计算后的迭代器,iter是个可迭代对象 an ...

  2. ansible中常用模块详解

    ansible中常用的模块详解: file模块 ansible内置的可以查看模块用法的命令如下: [root@docker5 ~]# ansible-doc -s file - name: Sets ...

  3. ansible中的playbook详解

    首先简单说明一下playbook,playbook是什么呢?根本上说playbook和shell脚本没有任何的区别,playbook就像shell一样,也是把一堆的命令组合起来,然后加入对应条件判断等 ...

  4. ansible中playbook使用

    palybook使用 ####yaml语法ansible中使用的yaml基础元素:变量Inventory条件测试迭代 playbook的组成结构InventoryModulesAd Hoc Comma ...

  5. ansible中yaml语法应用

    4.yaml语法应用 ansible的playbook编写是yaml语言编写,掌握yaml语法是编写playbook的必要条件,格式要求和Python相似,具体教程参考如下 yaml语言教程 附上一个 ...

  6. ansible中的常用循环模块with_items

    ansible中的循环模块有很多,不过with_items最为常用,且较为简单,循环模块最多的功能就是将重复性的任务简单化,如下例子所示: - hosts: all remote_user: root ...

  7. ansible中的docker_container模块

    docker_container模块 1.docker_container模块主要是用于ansible-playbook操作docker容器的一个模块,使用该模块可以实现批量创建docker容器 An ...

  8. ansible中tag的用法

    Tags 根据官方文档介绍: ansible允许通过自定义的关键字来给playbook中的资源打上标签,然后只运行标签标记的那个task任务. 例如,可能有个完成的OS配置,然后特定的步骤标记为“nt ...

  9. 二、Ansible中playbook的变量

    先看看debug模块的使用: msg:输出调试信息 var:将某个任务执行的输出作为变量传给debug模块,debug模块将其打印输出 verbosity:debug的任务级别   1:在playbo ...

随机推荐

  1. Spring Boot Web应用开发 CORS 跨域请求支持:

    Spring Boot Web应用开发 CORS 跨域请求支持: 一.Web开发经常会遇到跨域问题,解决方案有:jsonp,iframe,CORS等等CORS与JSONP相比 1. JSONP只能实现 ...

  2. python-常见用法

    一.注释 单行注释:#后全部注释 多行注释:'''所有内容'''  或者使用 """所有内容"""  ,多行注释用三对单引号或双引号包裹 二 ...

  3. Python之路(第三十九篇)管道、进程间数据共享Manager

    一.管道 概念 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 先画一幅图帮助大家理解下管道的基本原理 现有2个 ...

  4. node 项目中 koa2 环境搭建 以及项目发布

    环境搭建: 1.Koa 必须使用 7.6 以上的版本.如果你的版本低于这个要求,就要先升级 Node. 查看node版本方法:node -v 2.使用koa-generator生成器生成项目 安装ko ...

  5. 实验十五 GUI编程练习与应用程序部署

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...

  6. UWP作业(二)A Mobile App

    看到给出的十个技术主题,我第一反应就是,对于大部分社交软件来讲,运用到全部这些都并不是什么难题,倒不如谈谈我手机里现有的社交软件中,使用时间最短但(you)是(dian)最(bu)好(hao)奇(yo ...

  7. RAM和ROM

    RAM:随机存取存储器(英语:Random Access Memory,缩写:RAM),也叫主存,是与CPU直接交换数据的内部存储器.[1]它可以随时读写(刷新时除外,见下文),而且速度很快,通常作为 ...

  8. Oracle获取异常的具体出处dbms_utility.format_error_backtrace

    DBMS_UTILITY.FORMAT_ERROR_BACKTRACE :返回当前异常相应的描述,通过它就能知道异常的最初生成处.   系统为最近一次生成的异常设置了一个栈,并跟踪它的传递过程,而这个 ...

  9. 89、instancetype和id的区别

    1>instancetype在类型表示上,跟id一样,可以表示任何对象类型 2>instancetype只能用在返回值类型上,不能像id一样用在参数类型上 3>instancetyp ...

  10. Linux如何挂载U盘

    1,以root用户登陆   先加载USB模块 modprobe usb-storage   用fdisk -l 看看U盘的设备   假如U盘是sda1 2,确定在 目录 /mnt 下建立了 文件夹 / ...