ansible 修改文件变量_Ansible Playbook中的变量与引用

Ansible是一个系列文章,我会尽量以通俗易懂、诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些。

6bb8999b863d132e16df20d036400144.png

Ansible自动化运维

前言

前面有说到使用playbook来搞一些复杂的功能,我们使用YAML来写playbook,就像我们用其它语言写代码一样,也是可以定义变量的,能定义变量,那这个功能就不得了了,就有必要好好的讲讲了。变量就好比playbook的翅膀,让ansible playbook的使用场景大大增多。在Ansible中,变量的玩法有下面这几种:

  • 通过inventory定义变量
  • 通过文件定义变量
  • 使用远程主机的系统变量
  • 通过ansible-playbook命令行传入变量
  • 通过vars定义变量
  • 通过vars_files定义变量
  • 通过register注册变量
  • 使用vars_prompt传入变量

玩法还挺多的,下面就对这些玩法进行一一的总结,争取一次把Ansible中变量的玩法吃透。

通过inventory定义变量

我们可以在inventory文件中定义变量,然后在playbook中使用这些变量。到底怎么玩,下面我通过一段代码来举例说明:

192.168.1.3 key=10086 [server1]192.168.1.3[server1:vars]key=10087ansible_ssh_user='test1'

上面是我的inventory文件内容,我针对192.168.1.3这个主机定义了一个变量key,然后又针对server1这个主机组定义了变量key和ansible_ssh_user。然后我来写一个测试playbook,看下在inventory文件中定义的变量怎么用。

---- hosts: server1  tasks:    - name: Display var from inventory file      debug: msg="The {{ inventory_hostname }} value is {{ key }}"

输出内容如下:

[jelly@localhost yaml]$ ansible-playbook inventoryVar.yaml PLAY [server1] *************************************TASK [Gathering Facts] *****************************ok: [192.168.1.3]TASK [Display var from inventory file] *************ok: [192.168.1.3] => {    "msg": "The 192.168.1.3 value is 10086"}PLAY RECAP *****************************************192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0  

可以看到,我们通过{{}}来引用变量,同时也看到,主机定义的变量的优先级高于主机组定义的变量。

通过文件定义变量

通过文件定义变量这种玩法就用的更多了,在后面讲到role的时候,还会专门用到这个知识点的。说白了就是我们在playbook的同级目录建立两个名分别为host_vars和group_vars的文件夹,分别用来定义主机和主机组的变量。下面是我的文件结构:

[jelly@localhost yaml]$ tree.├── fileVar.yaml├── group_vars│   └── server1├── host_vars│   └── 192.168.1.3

host_vars文件夹下的文件用被管理主机的IP为文件名,比如此处的192.168.1.3,文件内容按照YAML的语法进行定义,比如此处192.168.1.3的内容如下:

key: 10086

group_vars文件夹下的文件用inventory下定义的组名来命名,比如此处的server1,文件内容也是按照YAML语法进行定义,比如此处server1的内容如下:

foo:  field1: one  field2: two

在来看我的测试playbook,它是这样的:

---- hosts: server1  tasks:    - name: Display var from file      debug: msg="The {{ inventory_hostname }} value is {{ key }} and {{ foo.field1 }}"

重点是我们可以通过foo.field1这种方式来引用复杂的变量,运行结果如下:

[jelly@localhost yaml]$ ansible-playbook fileVar.yaml PLAY [server1] *************************************TASK [Gathering Facts] *****************************ok: [192.168.1.3]TASK [Display var from file] ***********************ok: [192.168.1.3] => {    "msg": "The 192.168.1.3 value is 10086 and one"}PLAY RECAP *****************************************192.168.1.3                : ok=2    changed=0    unreachable=0    failed=0  

使用远程主机的系统变量

不知道大家有没有看过上篇说过的Ansible Facts,我们通过setup模块获取的远程主机的信息可以直接作为变量在playbook中引用。是的,这样就大大方便了我们的工作。下面牛通过一个简单的playbook来看看怎么玩。

---- hosts: server1  tasks:     - name: Echo System      debug: msg="{{ ansible_os_family }}"

ansible_os_family是ansible_facts节点下的一个值,我们可以直接在playbook中直接应用。就是这么简单!

通过ansible-playbook命令行传入变量

上面的三种方式在我们日常工作中用的比较多,接下来说说怎么通过ansible-playbook命令行传参的方式定义变量。先来看下我们的测试YAML脚本:

---- hosts: server1  tasks:     - name: ansible-playbook command var      debug: msg="var1 is {{ var1 }}; var2 is {{ var2 }}"

我们在命令行输入以下命令进行执行:

ansible-playbook commandVar1.yaml -e "var1=1 var2=2"

除了这里说的直接传入变量,目前ansible-playbook还支持指定文件的方式传入变量,变量文件的内容支持YAML和JSON两种格式,来看下怎么玩!!!

我这里准备了两个文件,分别是YAML和JSON格式的。内容如下:

[jelly@localhost yaml]$ cat var.json {"var1":"10086", "var2":"10087"}[jelly@localhost yaml]$ cat var.yaml ---var1: 10086var2: 10087

接下来,我在命令行指定var.json或者var.yaml文件传入变量:

ansible-playbook commandVar1.yaml -e "@var.json"

玩起来还是蛮简单的!

注意:ansible-playbook命令行传进去的变量都是全局变量

通过vars定义变量

通过vars定义变量,这个就简单了,在之前的文章中也有说过,这里就通过一个简单的YAML脚本来演示。

---- hosts: server1  vars:    var1: 10086    var2: 10087  tasks:     - name: Display vars      debug: msg="var1 is {{var1}}, var2 is {{var2}}"

这个就是这么简单,自己理解去吧!!!

通过vars_files定义变量

这种玩法就有点意思了,怎么说呢。我们可以把所有的变量定义到某个文件内,然后在playbook文件内使用vars_files参数引用这个变量文件。比如这样子:

---- hosts: server1  vars_files:    - var.yaml  tasks:     - name: Display vars      debug: msg="var1 is {{var1}}, var2 is {{var2}}"

通过register注册变量

如果我们有需要在两个task之间传递数据的场景,就可以考虑使用这里的register注册变量了,比如我们在一个playbook中有两个task,分别是TaskA和TaskB,如果TaskB需要根据TaskA的执行结果做一些判断,这个时候就需要在两个task之间传递数据,把TaskA的执行结果传递给TaskB。怎么搞?看下面的代码。

---- hosts: server1  tasks:    - name: TaskA      shell: hostname      register: info    - name: TaskB      debug: msg="TaskA's output is {{info}}"

执行上面的YAML脚本,输出结果如下:

[jelly@localhost yaml]$ ansible-playbook registerVar.yaml PLAY [server1] ******************************************TASK [Gathering Facts] **********************************ok: [192.168.1.3]TASK [TaskA] ********************************************changed: [192.168.1.3]TASK [TaskB] ********************************************ok: [192.168.1.3] => {    "msg": "TaskA's output is {'changed': True, 'end': '2019-10-08 08:34:11.129667', 'stdout': 'localhost.localdomain', 'cmd': 'hostname', 'rc': 0, 'start': '2019-10-08 08:34:11.123739', 'stderr': '', 'delta': '0:00:00.005928', 'stdout_lines': ['localhost.localdomain'], 'stderr_lines': [], 'failed': False}"}PLAY RECAP **********************************************192.168.1.3                : ok=3    changed=1    unreachable=0    failed=0  

从上面的YAML脚本,我们可以看到TaskA中执行的hostname命令,它的输出结果注册到了info中,这样一来,在TaskB中就可以引用info了,完成数据在task之间的传递。

同时也可以看到,info的结果是一段Python字段数据,里面存储着很多信息包含执行时间、状态变化等信息。register的输出数据结果都是Python字典,我们可以很容易地挑选出我们想要的信息,比如这样:

---- hosts: server1  tasks:    - name: TaskA      shell: hostname      register: info    - name: TaskB      debug: msg="TaskA's output is {{info.stdout}}"

使用vars_prompt传入变量

Ansible还支持在运行playbook的时候通过交互式的方式给定义好的参数传入变量值,只需要在playbook中定义vars_prompt的变量名和交互式提示内容即可!就像下面这样:

---- hosts: server1  vars_prompt:    - name: "var1"      prompt: "Please input var1"      private: no    - name: "var2"      prompt: "Please input var2"      default: '10086'      private: yes  tasks:     - name: echo var1      debug: msg="var1 is {{var1}}"    - name: echo var2      debug: msg="var2 is {{var2}}"

在运行上面的YAML脚本的时候,会提示进行变量输入,其中我们定义的var1为非私有变量,var2为私有变量还有一个默认值。当定义为私有变量时,在终端输入变量时,则不会显示对应的值,就像我们ssh登陆主机,输入密码看不见一样。

总结

哦,我的天哪!总结完一看,这么长,这么多内容;但是还好,内容虽多,但是蛮简单的。在上班路上,或者下班路上,看看这么一篇总结,也还是不错的。希望你看完这篇文章后,能感叹一下,Ansible的变量玩法还有这么多啊。玩了Ansible这么久,就是感觉这货一直都在给我带来惊喜,越来越好玩,越来越耐玩!还等什么,搞个测试环境,也玩一玩!

果冻想,认真玩技术的地方。

2019年10月8日,于内蒙古呼和浩特。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446280.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STL源码剖析 list概述

目录 list的节点(node) list迭代器 list 的构造和内存管理 list 的元素操作 list相较于vector连续的线性空间就显得很复杂,他的存储空间是不连续的,好处是每次插入和删除一个元素的时候,只需要配置或者释放一个元素的空间 插入和删除十分的…

vsftp不允许切换到其它目录_IntelliJ IDEA如何对project的目录进行筛选显示?

如果你的项目很庞大,同一个功能用到的各种文件散落在多个文件夹,开发时切换不便,可以利用scope功能,只显示该功能用到的文件,让project列表十分清爽,提高开发效率。本文使用的IDEA版本为2020.1。1、打开sco…

密码学专题 对称加密算法

一般来说,使用OpenSSL对称加密算法有两种方式,一种是使用API函数的方式,一种是使用OpenSSL提供的对称加密算法指令方式。本书将介绍对称加密算法的指令方式OpenSSL的对称加密算法指令主要用来对数据进行加密和解密处理,输入输出的…

网络防火墙单向和双向_单向晶闸管与双向晶闸管之间的不同之处

晶闸管是回一个可以控导点开关,能以弱电去控制强电的各种电路。晶闸管常用于整流,调压,交直流变化,开关,调光等控制电路中。具有提交小,重量轻,耐压高,容量大,效率高&…

python版本切换_怎么切换python版本

展开全部 (1)分别安2113装 python-2.7.12.amd64.msi python-3.5.2-amd64.exe (python官网下载的) 顺序无所谓(为5261了看着4102方便,我把安装路径修改统一了1653) (2)配置…

react.lazy 路由懒加载_Vue面试题: 如何实现路由懒加载?

非懒加载import List from /components/list.vue const router new VueRouter({routes: [{ path: /list, component: List }] })方案一(常用)const List () > import(/components/list.vue) const router new VueRouter({routes: [{ path: /list, component: List }] })方…

STL源码剖析 deque双端队列 概述

vector是单向开口的连续线性空间,deque是一种双向开口的连续线性空间。deque可以在头尾两端分别进行元素的插入和删除操作vector和deque的差异 1,deque允许常数时间内对于头端元素进行插入和删除操作2,deque没有所谓容量(capacity)的概念&…

STL源码剖析 stack 栈 概述->(使用deque双端队列 / list链表)作为stack的底层容器

Stack是一种先进后出的数据结构,他只有一个出口stack允许 新增元素、移除元素、取得最顶端的元素,但是无法获得stack的内部数据,因此satck没有遍历行为Stack定义的完整列表 (双端队列作为Stack的底层容器) 将deque作为Stack的底部结构&#…

python怎么实现图像去噪_基于深度卷积神经网络和跳跃连接的图像去噪和超分辨...

Image Restoration Using Very Deep Convolutional Encoder-Decoder Networks with Symmetric Skip Connections作者:Xiao-Jiao Mao、Chunhua Shen等本文提出了一个深度的全卷积编码-解码框架来解决去噪和超分辨之类的图像修复问题。网络由多层的卷积和反卷积组成&a…

STL源码剖析 queue队列概述

queue是一种先进先出的数据结构,他有两个出口允许新增元素(从最底端 加入元素)、移除元素(从最顶端删除元素),除了对于顶端和底端元素进行操作之外,没有办法可以获取queue的其他元素即queue没有…

python为什么运行不了_python为什么会环境变量设置不成功

学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装 Windows 打开Python官方下载网站 x86:表示是32位电脑 x86-64:表示是64位电脑 目前Python版本分为2.x版本和3.x版本。推荐大家使用3.x版本。 设置环境变量&…

STL 源码剖析 heap堆

heap不属于STL容器的组件,属于幕后角色,是priority_queue的助手priority_queue 允许用户以任何次序将任何元素推入容器内,但是取出的时候需要从优先级最高(也就是数值最高)的元素开始取,这种思想是基于heap的函数实现如果使用list…

java 打印星号

代码1 package lesson.l2_for; //6列4行 //****** //****** //****** //****** public class ForDemo8 {public static void main(String[] args) {for (int i1;i<4;i){for (int j 1; j <6 ; j) {System.out.print("*");}System.out.println();}} }代码2 pa…

python从小白到大牛百度云盘_Java从小白到大牛 (关东升著) 中文pdf+mobi版[36MB]

《Java从小白到大牛》是一本Java语言学习立体教程&#xff0c;读者群是零基础小白&#xff0c;通过本书的学习能够成为Java大牛。主要内容包括&#xff1a;Java语法基础、Java编码规范、数据类型、运算符、控制语句、数组、字符串、面向对象基础、继承与多态、抽象类与接口、枚…

java打印九九乘法表

代码1 package lesson.l5_loop; //九九乘法表 //1*11 //2*12 2*24 //3*13 3*26 3*39 //4*14 4*28 4*312 4*416 //5*15 5*210 5*315 5*420 5*525 //6*16 6*212 6*318 6*424 6*530 6*636 //7*17 7*214 7*321 7*428 7*535 7*642 7*749 //8*18 8*216 8*324 8*432 8*540 8*648 8*75…

STL源码剖析 priority_queue

priority_queue是一个拥有权重概念的queue&#xff0c;允许底部加入新的元素&#xff0c;头部删除旧的元素&#xff0c;以及审视元素数值的操作priority_queue带有权重的概念&#xff0c;即元素按照权重进行排列&#xff0c;而不是按照插入队列的顺序进行排序。要求权值高者在前…

python数字1 3怎么表示_Python入门篇之数字

数字类型 数字提供了标量贮存和直接访问。它是不可更改类型&#xff0c;也就是说变更数字的值会生成新的对象。当然&#xff0c;这个过程无论对程序员还是对用户都是透明的&#xff0c;并不会影响软件的开发方式。 Python 支持多种数字类型&#xff1a;整型、长整型、布尔型、双…

STL源码剖析 slist单向链表概述

概述 SGI STL的list是一个双向链表&#xff0c;单向链表是slist&#xff0c;其不在标准规格之内单向和双向链表的区别在于&#xff0c;单向链表的迭代器是单向的 Forward Iterator&#xff0c;双向链表的迭代器属于双向的Bidirectional Iterator。因此很多功能都被受限但是单向…

output怎么用_用树莓派实现室内温度监控

树莓派加上温度传感器实现室内温度监控。可用于家庭&#xff0c;轿车&#xff0c;工业&#xff0c;农业 等许多方面。可做温度预警&#xff0c;自动降温等操作。各位小伙伴可自行脑补发挥。1.硬件准备a.树莓派&#xff08;Raspberry Pi&#xff09;一个b.DS18B20温度传感器一个…

STL源码剖析 关联式容器

STL关联式容器以set(集合) 和 map(映射表)两大类&#xff0c;以及对应的衍生体构成,比如mulyiset(多键集合) multimap(多键映射表) ,容器的底层均基于红黑树RB-Tree也是一个独立的容器&#xff0c;但是不对外开放此外还提供了标准之外的关联式容器 hash table散列表&#xff0c…