Ansible跨play引用变量的注意事项
背景
跨play引用变量出错,提示The task includes an option with an undefined variable. The error was: 'var1' is undefined
。
Ansible的变量可以通过几种主要的方式定义,var
、register
、set_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
这个变量,要想引用localhost
的var1
变量,则需要借助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"
}
...
参考链接
- How do I set register a variable to persist between plays in ansible? - Stack Overflow
Ansible跨play引用变量的注意事项相关推荐
- ansible playbook 中的变量用法相关介绍(三)----set_fact模块,跨play调用变量
1.通过set_fact定义变量 set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,先来看一个小示例,如下 [root@server4 ~]# vim set1.ym ...
- 【Android RTMP】x264 图像数据编码 ( Camera 图像数据采集 | NV21 图像数据传到 Native 处理 | JNI 传输字节数组 | 局部引用变量处理 | 线程互斥 )
文章目录 安卓直播推流专栏博客总结 一. NV21 数据传入 Native 层 二. jbyte * 数据类型 ( Java 中的 byte[] 数组传入 JNI 处理方式 ) 三. 局部引用处理 四 ...
- java(Hello World) 常量 变量和注意事项
一.java的入门程序 java语言的简单介绍 关于java语言的特点: (1) 简单性 和c++相比,java没有头文件.指针.运算符重载等,java语言相当于是一个比较纯净版的c++. (2) 面 ...
- C++中引用变量详解
目录 一.什么是引用? 二.引用的注意事项 三.引用的本质 四.常量引用 五.引用的使用场景 六.引用和指针的区别 一.什么是引用? 引用实际上是给一个变量起别名,编译器不会为引用变量开 ...
- java中equals方法的参数_equals方法的参数必须为Object类型的引用变量
核心结论:子类重写Object类的equals方法需要注意的事项 重写的时候一定要注意equals方法的参数是Object obj类型的引用变量.绝对不可以是其他类型的变量.因为这样的话,和父类Obj ...
- java对象创建与引用变量的详解
创建对象与引用变量 创建对象 基本类型变量和引用类型变量的区别 存储的值 赋值 引用数据和NULL 创建对象 ClassName objectRefVar = new ClassName(); 这条语 ...
- 接口的变量(引用变量)
在Java中,引用变量实际上是一个指针,它指向的是堆内存中的对象实例. 例: List<?> list=new ArrayList<?> Map<?,?> map= ...
- linux快捷键 赋值,2_Shell语言———bash的快捷键、变量声明、引用变量及变量替换...
一.初识bash Bash是一种解释型语言,但它也提供了交互式接口,支持变量,因此提供了编程环境,所以可以称bash为程序语言. 解释型语言属于弱类型语言,其特点为: 1.它不强制区分变量类型,即无论 ...
- 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选
欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...
最新文章
- NLP/CV模型跨界进行到底,视觉Transformer要赶超CNN?
- 二叉树的序列化与反序列化
- boost::log::attribute_value用法的测试程序
- 天池读书会六月场来啦,零基础也能听的懂的编程分享!
- python大数据运维库_大数据集群运维(10)Pycharm下安装模块
- log4j性能 slf4j_Log4j 2:性能接近疯狂
- JUnit测试方法订购
- [剑指offer]面试题第[47]题[JAVA][礼物的最大价值][动态规划]
- spring12----基于@AspectJ的AOP
- 量化策略开发中的参数调优
- 死磕算法!精选35篇算法设计实例+6本必读书打包送你
- 【VRP】基于matlab遗传算法求解单中心的车辆路径规划问题【含Matlab源码 059期】
- 提高linux运行速度,教你如何提高Linux操作系统的运行速度
- 怎样能看懂matlab中的代码,初学者怎样能看懂代码
- SpringMVC原理
- ov5640帧率配置_OV5640(2):配置寄存器
- 咖啡技能培训 | 成为咖啡师需要注意哪些方面?
- 这些旅游类短视频账号在快手涨粉的总结
- c语言实现图片过渡效果飞入,用css3实现转换过渡和动画效果
- 赛扬处理器_【推仔说新闻】英特尔发布新款奔腾、赛扬处理器