背景

跨play引用变量出错,提示The task includes an option with an undefined variable. The error was: 'var1' is undefined

Ansible的变量可以通过几种主要的方式定义,varregisterset_fact等等。但需要注意这些变量的命名空间,在Ansible中变量的命名空间“绑定”在主机上面。因此跨play引用变量时,如果针对的hosts不同,那么直接引用变量就会出错。

举例说明

- hosts: localhosttasks:- name: set var1 from localhostcommand: uname -rregister: var1- hosts: myhosttasks:- name: show var1.stdoutdebug:msg: "var1.stdout: {{ var1.stdout }}"

运行得到错误:The task includes an option with an undefined variable. The error was: 'var1' is undefined。这是因为在myhost的命名空间中没有var1这个变量,要想引用localhostvar1变量,则需要借助hostvars变量进行显式引用。变量引用应当写成{{ hostvars['localhost']['var1']['stdout'] }}或者{{ hostvars.localhost.var1.stdout }}。这是本文最核心的内容!

全一些的例子如下:

---
- hosts: localhosttasks:- name: set var1 in localhostcommand: uname -rregister: var1- hosts: localhosttasks:- name: show var1.stdout (same host)debug:var: var1.stdout- hosts: otherhosttasks:- name: show var1.stdout (different host)debug:var: var1.stdout- name: show var1.stdout from localhostdebug:var: hostvars.localhost.var1.stdout

执行结果:

...
PLAY [localhost] ******************************************************************************************************
TASK [show var1.stdout (same host)] ***********************************************************************************
ok: [localhost] => {"var1.stdout": "5.6.14-300.fc32.x86_64"
}
PLAY [otherhost] ******************************************************************************************************
TASK [show var1.stdout (different host)] ******************************************************************************
ok: [47.93.83.235] => {"var1.stdout": "VARIABLE IS NOT DEFINED!"
}
TASK [show var1.stdout from localhost] ********************************************************************************
ok: [47.93.83.235] => {"hostvars.localhost.var1.stdout": "5.6.14-300.fc32.x86_64"
}
...

第一次引用变量因为刚好是在相同主机localhost的不同play上,因此引用成功了。而后面两次从otherhost引用时,就必须进行显式引用了。

描述主机名

说到这里还有个坑,那就是对于主机名的引用,先看一个错误的例子:

[myhost]
59.110.48.254
---
- hosts: myhosttasks:- name: set var2 from myhostcommand: uname -rregister: var2- hosts: otherhosttasks:- name: show var2.stdout from myhostdebug:var: hostvars.myhost.var2.stdout

执行结果也是没有找到变量:

...
TASK [show var2.stdout from myhost] ***********************************************************************************
ok: [47.93.83.235] => {"hostvars.myhost.var2.stdout": "VARIABLE IS NOT DEFINED!"
}
...

这个例子中第一个play执行针对的是主机组myhost,而并非主机myhost,真正的主机是47.93.83.235,它没有被命名也不好被引用(确实有方法但相当复杂,不推荐也不解释)。因此,若要设计这样的playbook,inventory一定要写成下面这样:

myhost ansible_host=59.110.48.254

这样运行就不会出错了。

...
TASK [show var2.stdout from myhost] ***********************************************************************************
ok: [47.93.83.235] => {"hostvars.myhost.var2.stdout": "4.18.0-240.1.1.el8_3.x86_64"
}
...

参考链接

  1. How do I set register a variable to persist between plays in ansible? - Stack Overflow

Ansible跨play引用变量的注意事项相关推荐

  1. ansible playbook 中的变量用法相关介绍(三)----set_fact模块,跨play调用变量

    1.通过set_fact定义变量 set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,先来看一个小示例,如下 [root@server4 ~]# vim set1.ym ...

  2. 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )

    文章目录 安卓直播推流专栏博客总结 一. NV21 数据传入 Native 层 二. jbyte * 数据类型 ( Java 中的 byte[] 数组传入 JNI 处理方式 ) 三. 局部引用处理 四 ...

  3. java(Hello World) 常量 变量和注意事项

    一.java的入门程序 java语言的简单介绍 关于java语言的特点: (1) 简单性 和c++相比,java没有头文件.指针.运算符重载等,java语言相当于是一个比较纯净版的c++. (2) 面 ...

  4. C++中引用变量详解

    目录 一.什么是引用? 二.引用的注意事项 三.引用的本质 四.常量引用 五.引用的使用场景​​​​​​​ 六.引用和指针的区别 一.什么是引用? 引用实际上是给一个变量起别名,编译器不会为引用变量开 ...

  5. java中equals方法的参数_equals方法的参数必须为Object类型的引用变量

    核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...

  6. java对象创建与引用变量的详解

    创建对象与引用变量 创建对象 基本类型变量和引用类型变量的区别 存储的值 赋值 引用数据和NULL 创建对象 ClassName objectRefVar = new ClassName(); 这条语 ...

  7. 接口的变量(引用变量)

    在Java中,引用变量实际上是一个指针,它指向的是堆内存中的对象实例. 例: List<?> list=new ArrayList<?> Map<?,?> map= ...

  8. linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...

    一.初识bash Bash是一种解释型语言,但它也提供了交互式接口,支持变量,因此提供了编程环境,所以可以称bash为程序语言. 解释型语言属于弱类型语言,其特点为: 1.它不强制区分变量类型,即无论 ...

  9. 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选

    欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...

最新文章

  1. NLP/CV模型跨界进行到底,视觉Transformer要赶超CNN?
  2. 二叉树的序列化与反序列化
  3. boost::log::attribute_value用法的测试程序
  4. 天池读书会六月场来啦,零基础也能听的懂的编程分享!
  5. python大数据运维库_大数据集群运维(10)Pycharm下安装模块
  6. log4j性能 slf4j_Log4j 2:性能接近疯狂
  7. JUnit测试方法订购
  8. [剑指offer]面试题第[47]题[JAVA][礼物的最大价值][动态规划]
  9. spring12----基于@AspectJ的AOP
  10. 量化策略开发中的参数调优
  11. 死磕算法!精选35篇算法设计实例+6本必读书打包送你
  12. 【VRP】基于matlab遗传算法求解单中心的车辆路径规划问题【含Matlab源码 059期】
  13. 提高linux运行速度,教你如何提高Linux操作系统的运行速度
  14. 怎样能看懂matlab中的代码,初学者怎样能看懂代码
  15. SpringMVC原理
  16. ov5640帧率配置_OV5640(2):配置寄存器
  17. 咖啡技能培训 | 成为咖啡师需要注意哪些方面?
  18. 这些旅游类短视频账号在快手涨粉的总结
  19. c语言实现图片过渡效果飞入,用css3实现转换过渡和动画效果
  20. 赛扬处理器_【推仔说新闻】英特尔发布新款奔腾、赛扬处理器

热门文章

  1. Java调用微信小程序云数据库 调试记录
  2. ffmpeg 视频无损拼接 和一键拼接方法
  3. Java Map拆分成子Map
  4. c语言结构体写入dat文件中,.dat在C中的结构化文件处理(手册?)
  5. Hyperledger Fabric资产案例-链码实例
  6. qsort(快速排序)的用法
  7. python DHT网络爬虫
  8. python标准库pygame_用python基础百行之内以pygame为库的俄罗斯方块代码
  9. wireshark抓取网络聊天数据包
  10. 开源博客Solo安装详细教程及注意事项