自动化运维-ansible中的变量运用

自动化运维-ansible中的变量运用

一、变量命名规则

  • 组成:字母、数字、下划线。
  • 必须字母开头。
    • 合法: app_port, web_1, varA
    • 非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头)
  • 避免使用内置关键字:例如 hosts, tasks, name, vars, when, register 等。

二、变量的优先级

  1. Global范围(高):从命令行和ansible配置设置的变量
  2. play范围(中):set_fact、register和在play和相关结构中设置的变量
  3. Host范围(低):inventory、facts的变量,在主机组和个别主机上设置的变量

命令行 > Playbook 中的设置 > Inventory 中的设置 > 角色默认值

越“具体”的设置,优先级越高

三、注册和定义变量的各种方式

  1. vars 定义变量
  2. Vars_files 定义变量
  3. register 注册变量
  4. set_fact 定义变量
  5. 通过命令传入变量
  6. 主机清单中的变量
  7. 内置变量
  8. With_itens 叠加变量

四、对各种方式的示例

  1. vars 定义变量

    [student@master ansible] vim a.yml
    # 编辑内容如下
    ---
    - name: test1hosts: node1vars:- a: 1- b: 2- c:c1: 3c2: 4tasks:- name: test11debug:msg: this is {{ a }}- name: test12debug:msg: "{{ b }}"- name: test13debug:msg: "{{ c.c1 }}"- name: test14debug:var: c.c2
    

    在这里插入图片描述

  2. Vars_files 定义变量

    [student@master ansible] vim yyy
    # 编辑内容如下
    a: 1
    b: 2
    c: c1: 3c2: 4
    
    [student@master ansible] vim b.yml
    # 编辑内容如下
    ---
    - name: test2hosts: node1vars_files: /home/student/ansible/yyytasks:- name: test21debug:msg: this is {{ a }}- name: test22debug:msg: "{{ b }}"- name: test23debug:msg: "{{ c.c1 }}"- name: test24debug:var: c.c2
    

    在这里插入图片描述

  3. register 注册变量

    使⽤register选项,可以将当前task的输出结果赋值给⼀个变量

    以下示例:/tmp/file1 的内容为 123321 ,/tmp/file11 不存在

    [student@master ansible] vim c.yml
    # 编辑内容如下
    ---
    - name: test3hosts: node1tasks:- name: test31shell:cmd: cat /tmp/file1register: yy- name: test32debug:var: yy.stdout- name: test33shell:cmd: cat /tmp/file11register: yyyyignore_errors: yes- name: test34debug:var: yyyy.stdout
    

    在这里插入图片描述

    如图所示:无论输出结果是否正确,都会赋值给自定义的变量

  4. set_fact 定义变量

    可以将某个变量的值赋值给另⼀个变量,也可以将字符串赋值给变量

    事实变量是 Ansible 自动发现并设置的关于受控主机的系统信息属性的变量

    每个主机都有自己独有的一套事实变量,是Ansible预定义的,有固定的命名格式(通常以 ansible_ 为前缀),你不能随意改变这些变量的名字

    [student@master ansible] ansible node1 -m setup > z
    

    使用 ansible 主机名 -m setup 可以查看主机的所有事实变量

    为了方便查找,一般会重定向到自定义的文件中

    常用变量名对应的含义
    ansible_default_ipv4.addressipv4地址
    ansible_enp1s0.ipv4.addressansible_网卡名称.ipv4.address
    ansible_fqdn完全合格域名(FQDN)
    ansible_hostname主机名称
    ansible_memtotal_mb内存大小
    ansible_bios_versionbios版本
    ansible_devices.vda.sizevda硬盘大小
    ansible_devices.vdb.sizevdb硬盘大小
    ansible_lvm.vgs逻辑卷中卷组
    [student@master ansible] vim d.yml
    # 编辑内容如下
    ---
    - name: test4hosts: node1tasks:- name: test41debug:msg: the ipv4 address of {{ ansible_hostname }} is {{ ansible_default_ipv4.address }}
    

    在这里插入图片描述

  5. 通过命令传入变量

    [student@master ansible] vim e.yml
    # 编辑内容如下
    ---
    - name: test5hosts: node1tasks:- name: test51debug:msg: this is {{ aa }}- name: test52debug:var: bb
    

    在这里插入图片描述

  6. 主机清单中的变量

    在主机清单中定义变量

    [student@master ansible] vim inventory
    # 编辑内容如下
    node5[testa]
    node1
    node2[testa:vars]
    var1='ni'
    var2='hao'[testb]
    node3
    node4
    
    [student@master ansible] vim f.yml
    # 编辑内容如下
    ---
    - name: test6hosts: node1tasks:- name: test61debug:msg: "{{ var1 }}"- name: test62debug:msg: var2
    

    在这里插入图片描述

    除了可以在主机清单里定义变量外,还可以在 /etc/ansible(root用户)或 /home/用户名/ansible(普通用户) 目录下创建group_vars和host_vars目录下定义变量

    node1文件名以主机命名,还可以命名为node1.yml

    [student@master ansible] mkdir host_vars
    [student@master host_vars] vim node1
    [student@master host_vars] vim node1.yml
    
    # 在 node1 中编辑内容如下
    var1: t1
    var2: t2# 在 node1.yml 中编辑内容如下
    var1: t3
    var2: t4
    

    编辑 playbook ,看输出变量的值

    [student@master ansible] vim g.yml
    # 编辑内容如下
    ---
    - name: test7hosts: node1tasks:- name: test71debug:msg: "{{ var1 }}"- name: test72debug:var: var2

    在这里插入图片描述

    发现输出结果为 node1 中定义的值

    如果node1与node1.yml同时存在,则 node1的优先级更高

    除了在 host_vars 目录下,在 group_vars 目录下也同理

    如果 host_vars 目录和 group_vars 目录同时存在,则 host_vars 的优先级更高

  7. 内置变量

    是 Ansible 自动预定义和设置的变量。你无需使用 set_factvars 来声明它们

    为你提供关于当前运行环境、Inventory(清单)、Playbook 本身以及连接信息等重要上下文

    常用变量名对应作用
    ansible_version显示ansible的版本
    inventory_hostname显示主机清单主机名称
    play_hosts显示当前playbook实际要操作的所有主机的列表
    groups显示主机清单中的组与主机的对应关系
    groups.all显示所有清单主机
    group_names显示主机的主机组的名称
    inventory_dir显示主机清单所在的目录
  8. With_itens 叠加变量

    可以给一个变量赋予多个值

    让一个任务对列表中的每个项目执行一次

    [student@master ansible] vim h.yml
    # 编辑内容如下
    ---
    - name: test8hosts: node1tasks:- name: test81shell:cmd: echo "{{ item }}"with_items:- user1- user2- user3register: xx- name: test82debug:var: xx.results[0].stdout- name: test83debug:var: xx.results[1].stdout- name: test84debug:var: xx.results[2].stdout
    

    在这里插入图片描述

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

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

相关文章

深入学习并发编程中的volatile

volatile 的作用 保证变量的内存可见性禁止指令重排序1.保证此变量对所有的线程的可见性,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,其它线程每次使用前立即从主内存刷新。 但普通变量做不到这点,普通…

使用Java获取本地PDF文件并解析数据

获取本地文件夹下的PDF文件要获取本地文件夹下的PDF文件,可以使用Java的File类和FilenameFilter接口。以下是一个示例代码片段:import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吴恩达机器学习补充:决策树和随机森林

数据集:通过网盘分享的文件:sonar-all-data.csv 链接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取码: 12gr 学习来源:https://github.com/cabin-w/MLBeginnerHub 文末有完整代码,由于这里的代码和之前的按…

Shell脚本一键监控平台到期时间并钉钉告警推送指定人

1. 监控需求客户侧有很多平台需要定期授权,授权后管理后台才可正常登录,为避免授权到期,现撰写脚本自动化监控平台授权到期时间,在到期前15天钉钉或其他媒介提醒。2. 监控方案2.1 收集平台信息梳理需要监控的平台地址信息&#xf…

华为HCIE数通含金量所剩无几?考试难度加大?

最近网上很火的一个梗——法拉利老了还是法拉利,这句话套在华为HCIE数通身上同样适用,华为认证中的华为数通和云计算两大巨头充斥着大家的视野里面,也更加广为人知,但随着时代的发展,华为认证体系的调整,大…

#数据结构----2.1线性表

在数据结构的学习中,线性表是最基础、最核心的结构之一 —— 它是后续栈、队列、链表等复杂结构的 “基石”。今天从 “是什么”(定义)到 “怎么用”(基本操作),彻底搞懂线性表的核心逻辑。 一、先明确&…

2508C++,skia动画

gif动画原理 先了解一下gif动画的原理: gif动画由一系列静态图像(或叫帧)组成.这些图像按特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的. 每两帧之间有指定的时间间隔(一般小于60毫秒),gif播放器每渲染一帧静态图像后,即等待此时间间隔,依此逻辑不断循环渲染…

AI + 机器人:当大语言模型赋予机械 “思考能力”,未来工厂将迎来怎样变革?

一、引言1.1 未来工厂变革背景与趋势在科技飞速发展的当下,全球制造业正站在变革的十字路口。随着消费者需求日益多样化、市场竞争愈发激烈,传统工厂模式的弊端逐渐显现。生产效率低下、难以适应个性化定制需求、设备维护成本高昂且缺乏前瞻性等问题&…

pinia状态管理的作用和意义

1. 什么是状态管理 状态管理就是统一管理应用中的数据,让数据在多个组件之间共享和同步。 // 没有状态管理 - 数据分散在各个组件中 // 组件A const user ref({ name: 张三, age: 25 })// 组件B const user ref({ name: 张三, age: 25 }) // 重复定义// 组件C c…

十四、STM32-----低功耗

一、电源框图VDDA 供电区域,主要是 ADC 电源以及参考电压,STM32 的 ADC 模块配备独立的供电方 式,使用了 VDDA 引脚作为输入,使用 VSSA 引脚作为独立地连接,VREF 引脚为提供给 ADC 的 参考电压。电压调节器是 STM32 的…

一篇文章带你彻底搞懂 JVM 垃圾收集器

垃圾收集器是 JVM 内存管理的执行引擎,负责自动回收无用的对象内存。其设计核心是 权衡:主要是吞吐量和停顿时间之间的权衡。没有“最好”的收集器,只有“最适合”特定场景的收集器。一、核心基础:分代收集模型主流 HotSpot JVM 采…

服务器排故随笔:服务器无法ssh远程登录

文章目录服务器排故随笔:服务器无法远程登录问题现象解决过程第一步:确认故障描述是否准确第二步:确认网络是否有问题第三步:确认ssh服务是否有问题第四步:确认防火墙是否放行sshd服务第五步:试试万能的“重…

Deeplizard深度学习课程(六)—— 结合Tensorboard进行结果分析

前言 Tensorboard最初是tensorflow的可视化工具,被用于机器学习实验的可视化,后来也适配了pytorch。Tensorboard是一个前端web界面,,能够从文件里面读取数据并展示它(比如损失、准确率、网络图)。具体使用可…

C语言————实战项目“扫雷游戏”(完整代码)

无论是找工作面试,还是课设大作业、考研,都离不开实战项目的积累,如果你能把一个项目搞明白,并且给别人熟练的讲出来,即使你没有过项目经历,也可以说是非常加分的,下面来沉浸式体验一下这款扫雷…

数据结构之加餐篇 -顺序表和链表加餐

目录一、链表分割二、随机链表的复制总结一、链表分割 链表分割 题目描述的意思就如下图: 也就是把1,2挪到前面,6,3,5挪到后面,前者的相对顺序不发生改变 这里要想往后挪就要先遍历,遍历到6…

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南

JSP与Servlet整合数据库开发:构建Java Web应用的全栈指南 概述 在Java Web开发领域,JSP(JavaServer Pages)与Servlet是构建动态Web应用的核心技术组合。Servlet作为Java EE的基础组件,负责处理客户端请求、执行业务逻…

设计五种算法精确的身份证号匹配

问题定义与数据准备 我们有两个Excel文件: small.xlsx: 包含约5,000条记录。large.xlsx: 包含约140,000条记录。 目标:快速、高效地从large.xlsx中找出所有其“身份证号”字段存在于small.xlsx“身份证号”字段中的记录,并将这些匹配的记录保…

Spring 框架(IoC、AOP、Spring Boot) 的必会知识点汇总

目录:🧠 一、Spring 框架概述1. Spring 的核心功能2. Spring 模块化结构🧩 二、IoC(控制反转)核心知识点1. IoC 的核心思想2. Bean 的定义与管理3. IoC 容器的核心接口4. Spring Bean 的创建方式🧱 三、AOP…

简单工厂模式(Simple Factory Pattern)​​ 详解

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页: Meteors.的博客 💞当前专栏: 设计模式 ✨特色专栏: 知识分享 &…

新电脑硬盘如何分区?3个必知技巧避免“空间浪费症”!

刚到手的新电脑,硬盘就像一间空荡荡的大仓库,文件扔进去没多久就乱成一锅粥?别急,本文会告诉你新电脑硬盘如何分区,这些方法不仅可以帮你给硬盘分区,还可以调整/合并分区大小等。所以,本文的分区…