1.通过set_fact定义变量

set_fact是一个模块,我们可以通过set_fact模块在tasks中定义变量,先来看一个小示例,如下

[root@server4 ~]# vim set1.yml
[root@server4 ~]# cat set1.yml
---
- hosts: testBremote_user: roottasks:- set_fact:testvar: "testtest"- debug:msg: "{{testvar}}"

如上例所示,我们通过set_fact模块定义了一个名为testvar的变量,变量值为testtest,然后使用debug模块输出了这个变量:

是不是很简单,通过set_fact模块就能够在tasks中定义变量了,我们也可以通过set_fact将一个变量的值赋予另一个变量,示例如下

[root@server4 ~]# vim set2.yml
[root@server4 ~]# cat set2.yml
---
- hosts: testBremote_user: rootvars:testvar1: test1_stringtasks:- shell: "echo test2_string"register: shellreturn- set_fact:testsf1: "{{testvar1}}"testsf2: "{{shellreturn.stdout}}"- debug:msg: "{{testsf1}} {{testsf2}}"#var: shellreturn

上例中,我们先定义了一个变量testvar1,又使用register将shell模块的返回值注册到了变量shellreturn中,

之后,使用set_fact模块将testvar1变量的值赋予了变量testsf1,将shellreturn变量中的stdout信息赋值给了testsf2变量,(可以将注释去掉查看变量shellreturn的值)

最后,使用debug模块输出了testsf1与testsf2的值:

[root@server4 script]# ansible-playbook set2.yml


如上述示例所示,set_fact模块可以让我们在tasks中创建变量,也可以将一个变量的值赋值给另一个变量。

其实,通过set_fact模块创建的变量还有一个特殊性,通过set_fact创建的变量就像主机上的facts信息一样,可以在之后的play中被引用。

默认情况下,每个play执行之前都会执行一个名为”[Gathering Facts]”的默认任务,这个任务会收集对应主机的相关信息,我们可以称这些信息为facts信息,我们已经总结过怎样通过变量引用这些facts信息,此处不再赘述,而通过set_fact模块创建的变量可以在之后play中被引用,就好像主机的facts信息可以在play中引用一样,这样说可能还是不是特别容易理解,不如来看一个小例子,如下

[root@server4 ~]# vim set3.yml
[root@server4 ~]# cat set3.yml
---
- hosts: testBremote_user: rootvars:testvar1: tv1tasks:- set_fact:testvar2: tv2- debug:msg: "{{testvar1}} ----- {{testvar2}}"- hosts: testBremote_user: roottasks:- name: other play get testvar2debug:msg: "{{testvar2}}"- name: other play get testvar1debug:msg: "{{testvar1}}"

上例中一共有两个play,第一个play中,我们通过两种方式创建了两个变量,第一个变量testvar1使用vas关键字创建,第二个变量使用set_fact创建。

执行上例的playbook:

[root@server4 script]# ansible-playbook set3.yml



可以发现,这两个变量在第一个play中都可以正常的输出。但是在第二个play中,testvar2可以被正常输出了,testvar1却不能被正常输出,会出现未定义testvar1的错误,因为在第一个play中针对testB主机进行操作时,testvar1是通过vars关键字创建的,而testvar2是通过set_fact创建的,所以testvar2就好像testB的facts信息一样,可以在第二个play中引用到,而创建testvar1变量的方式则不能达到这种效果,虽然testvar2就像facts信息一样能被之后的play引用,但是在facts信息中并不能找到testvar2,只是”效果上”与facts信息相同罢了。

2.通过注册变量实现跨play调用变量

前文已经总结了注册变量的用法,其实注册变量也可以在之后的play操作同一主机时被调用到,示例如下

[root@server4 ~]# vim bltest11.yml
[root@server4 ~]# cat bltest11.yml
---
- hosts: testBremote_user: rootvars:testvar3: tv3tasks:- shell: "echo tv4"register: testvar4- debug:msg: "{{testvar3}} -- {{testvar4.stdout}}"- hosts: testBremote_user: roottasks:- name: other play get testvar4debug:msg: "{{testvar4.stdout}}"- name: other play get testvar3debug:msg: "{{testvar3}}"

执行上例的playbook:

[root@server4 script]# ansible-playbook set4.yml



在第二个play中获取”testvar3″时会报错,而在第二个play中获取注册变量”testvar4″时则正常,但是,注册变量中的信息是模块的返回值,这并不是我们自定义的信息,所以,如果想要在tasks中给变量自定义信息,并且在之后的play操作同一个主机时能够使用到之前在tasks中定义的变量时,则可以使用set_facts定义对应的变量。

上述示例中,即使是跨play获取变量,也都是针对同一台主机。

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

  1. ansible playbook中 tags 的用法

    1.问题提出 如果你写了一个很长的playbook,其中有很多的任务,这并没有什么问题,不过在实际使用这个剧本时,你可能只是想要执行其中的一部分任务而已,或者,你只想要执行其中一类任务而已,而并非想要 ...

  2. Ansible playbook中role的用法

    要使用role首先要创建一个roles目录,这个目录在ansible.cfg里推荐使用/etc/ansible/roles,当然你也可以自己去指定roles的路径: 使用role,就是把之前的Play ...

  3. c语言程序中变量先引用声明,C语言如何跨文件调用函数定义中声明的变量

    变量的作用域 我们知道,变量根据其作用域有全局变量和局部变量之分.全局变量作用域是整个文件,并且可以使用关键字 extern 达到跨文件调用的目的.但是局部变量值作用于它当前所在的块(即该变量所处最内 ...

  4. python函数对变量的作用_Python 包、模块、函数、变量作用域

    Python 项目的组织结构 - 包 -- 模块 --- 类 ---- 函数.变量 Python是利用包和模块来组织一个项目的. 包: 包的物理表现是一个文件夹,但是一个文件夹却不一定是个包,要想让个 ...

  5. mysql 中show 命令用法详细介绍 mysql过程(procedure)的使用

    a. show tables或show tables from database_name; -- 显示当前数据库中所有表的名称 b. show databases; -- 显示mysql 中所有数据 ...

  6. 研发团队中 矩阵式管理 的相关介绍以及 应用

    2019独角兽企业重金招聘Python工程师标准>>> 很多较大的企业会采用矩阵式管理,所谓矩阵式管理就是按照产品线和资源线两条线来组织和管理团队.产品线由开发的项目组成,比如项目1 ...

  7. jQuery中$.fn的用法示例介绍

    $.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效,下面有个不错的示例,喜欢的朋友可以参考下 $.fn是指jquery的命名空间,加上fn上的方法及属性,会对j ...

  8. ansible playbook中使用迭代with_items案例

    with_items使用案例 案例:循环创建两个用户 验证这两个用户是否已经创建成功: 案例:批量删除目录 案例:批量安装软件 案例:批量拷贝目录 案例:不同软件所属不同用户及用户组 字典的运用. 检 ...

  9. python中pass的用法_python学习之getpass模块使用

    我们登入linux时,输入密码是什么都不显示的,在python中也可以这样做,那就是getpass模块(在pycharm中无法使用) getpass模块中包含几个比较实用的功能: 1.getpass ...

最新文章

  1. 【控制】《多智能体系统一致性协同演化控制理论与技术》纪良浩老师-第12章-离散时间多智能体系统牵制一致性
  2. vc 只有顶级窗口可以弹出窗口_如何在Mac上允许弹出窗口
  3. mysql 选择字符集 拉丁字符集_mysql的字符集
  4. Python多继承基础
  5. ubuntu intellij java_在Linux上,安装Intellij IDEA进行Scala开发
  6. 大白话5分钟带你走进人工智能-第二十节逻辑回归和Softmax多分类问题(5)
  7. 成功创业者所需的能力
  8. vue子组件向父组件传递数据
  9. python socket模块 和pyqt5_PyQt5+Socket实现CS架构的建议聊天室
  10. csdn怎么查看自己写的文章
  11. x64伪装进程路径 过PCHunter xxx ARK
  12. 4am永远 鼠标按键设置_罗技的MX Master鼠标是苹果Mac系统下最好的鼠标
  13. cocos2dx[3.x](11)——拖尾渐隐效果MotionStreak
  14. 连接局域网内的oracle
  15. DC-DC电源输出纹波测量方法
  16. 2018年大连民族大学全国计算机,走进高校:大连民族大学(附2019各省录取线)...
  17. ip话机 mitel_华为IP话机
  18. Vue路由守卫实现无登录只跳转到登录页面
  19. python 收发微信之二:获取微信上行信息(利用 flask 框架实现 Web API,获取 WxPusher 上行微信)
  20. 运维老兵对运维中常见技术类问题剖析

热门文章

  1. 【python】python中os.listdir的排序问题
  2. HTTP协议状态码的含义
  3. mico3165嵌入式开发板IAR环境搭建以及Demo运行
  4. 数字化转型:企业转型的数据治理方式
  5. 网站不加“www”无法访问怎么解决?
  6. c++语言读取excel文件,C++读取Excel文档(CSV) | C/C++程序员之家
  7. 什么是框架,到底为什么要使用框架?
  8. 基于imx8的成熟360全景方案 ,NVP6324+IMX8,N4+IMX8
  9. python什么证书最有价值,python考什么证含金量高
  10. linux无线usb网卡,Linux下USB无线网卡WL-167G驱动安装过程