Ansible之变量

一)Ansible变量介绍

我们在PlayBook⼀节中,将PlayBook类⽐成了Linux中的shell。
那么它作为⼀⻔Ansible特殊的语⾔,肯定要涉及到变量定义、控
制结构的使⽤等特性。
在这⼀节中主要讨论变量的定义和使⽤

二)变量命名规则

变量的名字由字母、下划线和数字组成,必须以字母开头。
如下变量命名为正确格式:

good_a
ok_b

如下是错误的变量名:

_aaa
2_bb

保留关键字不可以作为变量名称:

add, append, as_integer_ratio, bit_length,
capitalize, center, clear,
conjugate, copy, count, decode, denominator,
difference,
difference_update, discard, encode, endswith,
expandtabs,
extend, find, format, fromhex, fromkeys, get,
has_key,
hex, imag, index, insert, isalnum, intersection,
intersection_update, isalpha, isdecimal, isdigit,
isdisjoint, is_integer, islower,
isnumeric, isspace, issubset, issuperset, istitle,
isupper,
items, iteritems, iterkeys, itervalues, join, keys,
ljust, lower,lstrip, numerator, partition, pop, popitem, real,
remove,replace, reverse, rfind, rindex, rjust, rpartition,
rsplit, rstrip,setdefault, sort, split, splitlines, startswith,
strip, swapcase,
symmetric_difference, symmetric_difference_update,
title,
translate, union, update, upper, values, viewitems,
viewkeys,
viewvalues, zfill

三)变量类型

根据变量的作用范围大体的将变量分为:

  • 全局变量
  • 剧本变量
  • 资产变量

但这是一种较为粗糙的划分,不足以囊括Ansible中的所有变量。

1.全局变量

全局变量,是我们使⽤ansible 或使⽤ansible-playbook 时,⼿动
通过 -e 参数传递给Ansible 的变量。
通过ansible 或 ansible-playbook 的 help 帮助, 可以获取具体格
式使⽤⽅式:

# ansible-playbook -h | grep var-e EXTRA_VARS, --extra-vars EXTRA_VARSset additional variables as key=value or YAML/JSON, if# ansible -h |grep varpath for many features including roles/ group_vars/-e EXTRA_VARS, --extra-vars EXTRA_VARSset additional variables as key=value or YAML/JSON, if
例子

传递普通的key=value 的形式

ansible all -i localhost, -m debug -a "msg='my key is {{ key }}'" -e "key=value"

image.png
传递⼀个YAML/JSON 的形式(注意不管是YAML还是JSON,它们的最终格式⼀定要是⼀个字典)
Json格式----
image.png

 ansible all -i localhost, -m debug -a "msg='name is {{ name }}, type is {{ type }}'" -e @a.json

image.png
Yml格式–
image.png

ansible all -i localhost, -m debug -a "msg='name is {{ name }}, type is {{ type }}'" -e @a.yml

image.png

2.剧本变量

在这只介绍两种最常用的定义方式:

a.通过PLAY属性vars定义
---
- name: test play varshosts: allvars:user: yuhome: /home/yu
b.通过PLAY属性var_files定义

当通过vars属性定义的变量很多时,这个Play就会感觉特别臃肿。
此时我们可以将变量单独从Play中抽离出来,形成单独的YAML ⽂件。

---
- name: test play varshosts: allvars_files:- vars/users.yml

image.png

c.在Playbook中使用变量的注意点
---
# 这⾥我们将上⾯的Playbook中引⽤变量的部分进⾏修改,去掉了双
引号。
- name: test play varshosts: allvars:user: lileihome: /home/lileitasks:- name: create the user {{ user }}user:# 注意这⾥将 "{{ user }}" 改成了 {{ user }}name: {{ user }}home: "{{ home }}”

执行以上的Playbook时,就会出现以下的错误:
image.png
这样错误的主要原因是PlayBook 是YAML 的⽂件格式, 当Ansible 分析YAML ⽂件时,有可能会误认为字典。name: {{ user }} 是⼀个字典的开始。因此加针对变量的使⽤,加上了双引号,避免Ansible错误解析。

3.资产变量

资产变量分为主机变量和主机组变量,分别针对资产中的单个主机
和主机组。

3.1主机变量

下面给大家一个实例,在以下资产中,定义了一个主机变量lilei,此变量只针对192.168.244.130这台服务器有效。
image.png
接下来掩饰验证
先获取定义的变量值

ansible 192.168.244.131 -i hostsandhostvars -m debug -a "msg='{{user}} {{port}}'"

image.png
可以看见运行结果
那么未获取到定义的变量值,因为user这个变量针对192.168.244.130主机无效

ansible 192.168.244.130 -i hostsandhostvars -m debug -a "var=user"

image.png

3.2主机组变量

以下资产中,定义了⼀个组变量home ,此变量将针对webservers 这个主机组中的所有服务器有效。
image.png
验证
home是web_servers的组变量,会针对这个组内的所有服务器生效。

ansible webservers -i hostsandgroupvars -m debug -a "var=home"

image.png

3.3主机变量vs主机组变量

接下来讨论一个问题,如果主机变量和组变量在同一资产中重名,会发生什么呢?
image.png
我们在资产中定义主机变量和组变量user,那么此时我们可以发现192.168.244.130这台机器的主机变量user的优先级更高。

ansible webservers -i hosts_2 -m debug -a "var=user"

image.png

3.4变量的继承

资产可以继承,那么变量当然也可以继承。
image.png
在资产继承的同时,对应的变量也会发生继承。

ansible allservers -i hosts_3 -m debug -a "var=user"

image.png

ansible dbservers -i hosts_3 -m debug -a "var=user"

image.png

ansible webservers -i hosts_3 -m debug -a "var=user"

image.png

3.5 Inventory内置变量的说明

内置变量一般都会以ansible_为前缀

ansible_ssh_host
#将要连接的远程主机名与你想要设定的主机的别名不同的话,可通过此变量设置.
ansible_ssh_port
#ssh端⼝号.如果不是默认的端⼝号,通过此变量设置.
ansible_ssh_user
#默认的 ssh ⽤户名
ansible_ssh_pass
#ssh 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --askpass 或 SSH 密钥)
ansible_sudo_pass
#sudo 密码(这种⽅式并不安全,官⽅强烈建议使⽤ --asksudo-pass)
ansible_sudo_exe (new in version 1.8)
#sudo 命令路径(适⽤于1.8及以上版本)
ansible_ssh_private_key_file
#ssh 使⽤的私钥⽂件.适⽤于有多个密钥,⽽你不想使⽤ SSH代理的情况.
ansible_python_interpreter
#⽬标主机的 python 路径.适⽤于的情况: 系统中有多个Python, 或者命令路径不是"/usr/bin/python",⽐如 /usr/local/bin/python3

4.Facts变量

Facts变量不包含在前⽂中介绍的全局变量、剧本变量及资产变量
之内。
Facts变量不需要我们⼈为去声明变量名及赋值。
它的声明和赋值完全有Ansible 中的 setup 模块帮我们完成。
它收集了有关被管理服务器的操作系统版本、服务器IP地址、主机名,磁盘的使⽤情况、CPU个数、内存⼤⼩等等有关被管理服务器的私有信息。
在每次PlayBook运⾏的时候都会发现在PlayBook执⾏前都会有⼀个Gathering Facts的过程。这个过程就是收集被管理服务器的Facts信息过程。

4.1手动收集Facts变量
ansible all -i localhost, -c local -m setup

image.png
运行结果有很多,我就不全部截取了

4.2过滤Facts

通过刚刚的⼿动收集Facts,我们发现facts 信息量很⼤。 能不能有针对性的显示我们想要的信息呢?
可以通过使⽤Facts 模块中的filter参数去过滤我们想要的信息。
仅获取服务器的内存情况信息

ansible all -i localhost, -m setup -a "filter=*memory*" -c local

image.png
仅获取服务器的磁盘挂载情况

ansible all -i localhost, -m setup -a "filter=*mount*" -c local

image.png

4.3在Playbook中去使用Facts变量

默认情况下,在执⾏PlayBook的时候,它会去⾃动的获取每台被管理服务器的facts信息。

---
- name: a play examplehosts: allremote_user: roottasks:- name: install nginx packageyum: name=nginx state=present- name: copy nginx.conf to remote servercopy: src=nginx.conf
dest=/etc/nginx/nginx.conf- name: start nginx serverservice:name: nginxenabled: truestate: started

将这段playbook命名为test_1.yml并且执行

ansible-playbook test_1.yml

image.png
可以像使用其他变量一样,去使用facts变量

---
- name: print facts variablehosts: alltasks:- name: print facts variabledebug:msg: "The default IPV4 address is {{ ansible_default_ipv4.address }}"

在playbook中去关闭Facts变量的获取
若在整个playbook的执行过程中,完全未使用过Facts变量,此时我们可以将其关闭,以加快playbook的执行速度。

---
- name: a play examplehosts: webservers# 关闭 facts 变量收集功能gather_facts: noremote_user: roottasks:- name: install nginx packageyum: name=nginx state=present- name: copy nginx.conf to remote servercopy: src=nginx.confdest=/etc/nginx/nginx.conf- name: start nginx serverservice:name: nginxenabled: truestate: started

将其命名为test_2.yml并且执行

ansible-playbook -i hosts test_2.yml

image.png

5.注册变量

往往⽤于保存⼀个task任务的执⾏结果, 以便于debug时使⽤。
或者将此次task任务的结果作为条件,去判断是否去执⾏其他task任务。
注册变量在PlayBook中通过register关键字去实现。

---
- name: install a package and print the resulthosts: webserversremote_user: roottasks:- name: install nginx packageyum: name=nginx state=presentregister: install_result- name: print resultdebug: var=install_result

将以上代码命名为test_3.yml并执行

ansible-playbook test_3.yml

image.png

6.变量优先级

⽬前介绍了全局变量、剧本变量、资产变量、Facts变量及注册变量。
其中Facts变量不需要⼈为去声明、赋值;注册变量只需通过关键字register去声明,⽽不需要赋值。
⽽全局变量、剧本变量及资产变量则完全需要⼈为的去声明、赋值。
变量的优先权讨论,也将着重从这三类变量去分析。
假如在使⽤过程中,我们同时在全局变量、剧本变量及资产变量声明了同⼀个变量名,那么哪⼀个优先级最⾼呢? 下⾯我们将以实验的形式去验证变量的优先级
环境准备:
定义一份资产、且定义了资产变量user
image.png
(由于试验机性能问题,我缩减了试验机的数量,读者可自行增加)
编写一份Playbook、同样定义剧本变量user

---
- name: test variable priorityhosts: allremote_user: rootvars:user: mysqltasks:- name: print the user valuedebug: msg='the user value is {{ user }}'

将其命名为test_4.yml
验证测试–
同时使用全局变量、剧本变量、资产变量
当变量user同时定义在全局变量、剧本变量及资产变量中时,全局变量的优先级最⾼。

ansible-playbook -i hosts test_4.yml -e "user=www"

image.png
同时使用剧本变量和资产变量
取消全局变量,发现剧本变量的优先级要高于资产变量的优先级

ansible-playbook -i hosts test_4.yml

image.png
只是用资产变量的情况下
我们不使用全局变量、且注释掉剧本变量后,资产变量才最终生效。

---
- name: test variable priorityhosts: allremote_user: root#vars:# user: mysqltasks:- name: print the user valuedebug: msg='the user value is {{ user }}'
ansible-playbook -i hosts test_4.yml

image.png
**变量优先级结论 **
当⼀个变量同时在全局变量、剧本变量和资产变量中定义时,优先级最⾼的是全局变量;其次是剧本变量;最后才是资产变量。

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

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

相关文章

机器学习-波士顿房价预测

目录 一.数据处理 读入数据 数据形状变换 数据集划分 数据归一化处理 将上面封装成load data函数 二. 模型设计 完整封装运行代码: 根据loss值进行梯度计算 控制部分变量的变化图像: 一.数据处理 读入数据 # 导入需要用到的package import numpy as np…

51单片机热水器温度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)

51单片机热水器温度控制系统仿真设计 1.主要功能:2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单 &&下载链接 51单片机热水器温度控制系统仿真设计( proteus仿真程序原理图报告讲解视频) 仿真图proteus7.8及以上 程序编译器&#x…

常见的几种排序算法

目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …

按键精灵调节界面不显示插件

就像我这样的---这是正常的现象 但是假如你不小心把这个给岔了,那么 点击了启动它就是这样的 这个东西的唯一解决措施就是电脑重启,没得办法,天地万物都有bug这个没得办法

Vue——vue3中的ref和reactive数据理解以及父子组件之间props传递的数据

ref()函数 这是一个用来接受一个内部值,返回一个响应式的、可更改的 ref 对象,此对象只有一个指向其内部值的属性 .value。 作用:创建一个响应式变量,使得某个变量在发生改变时可以同步发生在页面上。 模板语句中使用这个变量时…

使用Puppeteer进行游戏数据可视化

导语 Puppeteer是一个基于Node.js的库,可以用来控制Chrome或Chromium浏览器,实现网页操作、截图、测试、爬虫等功能。本文将介绍如何使用Puppeteer进行游戏数据的爬取和可视化,以《英雄联盟》为例。 概述 《英雄联盟》是一款由Riot Games开…

docker 安装rabbitmq

前提:安装好docker docker安装_Steven-Russell的博客-CSDN博客 centos7安装docker_centos7 docker 安装软件_Steven-Russell的博客-CSDN博客 1、启动docker systemctl start docker 2、下载镜像 // 可以先search查询一下可用镜像,此处直接下载最新版本…

JavaScript代码中字符串如何换行?

在工作中,代码提交之前可能会有一些语法检查的限制,限制我们的单行代码长度。 对于一些逻辑代码,有多种换行方式。这里主要记录一下对于字符串过长情况的处理方式。 对于字符串,除了使用 进行字符串拼接之外,也可以…

在公网上使用SSH远程连接安卓手机Termux:将Android手机变身为远程服务器

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

猫头虎博主赠书二期:《Go黑帽子 渗透测试编程之道(安全技术经典译丛) 》

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…

算法通关村第11关【白银】| 位运算高频算法题

一、移位的妙用 1.位1的个数 思路: 利用一个数和1与操作,结果就是最低位的特点,每次右移都能知道一位是不是1 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int count 0;for(in…

Oracle数据库尚硅谷学习笔记

文章目录 Oracle数据库体系结构简介补充SQL初步导入sql文件别名连接符distinct去重的坑 过滤和排序数据日期格式比较运算其它比较运算符逻辑运算优先级排序 单行函数SQL中不同类型的函数单行函数字符数值日期转换通用 使用条件表达式嵌套查询 多表查询等值连接非等值连接左外连…

解决微信小程序recycle-view使用百分比单位控制宽高时出现的内容溢出问题

recycle-view是微信小程序官方推出的一个经过优化的长列表组件,但是在使用百分比单位控制高宽时有个内容溢出问题,虽然它提供了height和width的参数可以设置宽高,但每次写列表都需要去js里获取宽高并设置是较为麻烦的,所以现在来着…

ES是一个分布式全文检索框架,隐藏了复杂的处理机制,核心数据分片机制、集群发现、分片负载均衡请求路由

ES是一个分布式框架,隐藏了复杂的处理机制,核心数据分片机制、集群发现、分片负载均衡请求路由。 ES的高可用架构,总体如下图: 说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面…

Qt/C++音视频开发49-推流到各种流媒体服务程序

一、前言 最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和…

QT DAY6

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);socket new QTcpSocket(this);//如果连接服务器成功,该客户端就会发射一个connected的信号。//我们…

MyBatis关系映射

文章目录 前言一、一对一映射1.1 创建实体1.2 xml配置 二、一对多映射2.1 创建实体2.2 resultMap配置2.3 测试 三、 多对多映射3.1 创建实体3.2 resultMap配置3.3 测试 前言 MyBatis是一个Java持久化框架,它提供了一种将数据库表和Java对象之间进行关系映射的方式。…

css画箭头图标放标题前面,旋转,border的单个边框设置

CSS边框属性_css border dotted_小张biubiu的博客-CSDN博客 你还不知道css的旋转效果怎么实现?来这里看看吧_css旋转效果_我糖呢的博客-CSDN博客 .sub-title{position: relative;margin-left: 59px;& span{color: #1CDBFE;};& span::before{content: "…

算法通关村十四关:青铜-堆结构

青铜挑战-堆结构 堆结构:重要的基础数据结构 明确什么类型的题目可以用堆,以及如何用堆来解决 堆的构造和维护过程都非常复杂 1.堆的概念与特征 1.1基本概念 堆:是将一组数据按照 完全二叉树 的存储顺序,将数据存储在一个一…

S32K324芯片学习笔记

文章目录 Core and architectureDMASystem and power managementMemory and memory interfacesClocksSecurity and integrity安全与完整性Safety ISO26262Analog、Timers功能框图内存mapflash Signal MultiplexingPort和MSCR寄存器的mapping Core and architecture 两个Arm Co…