当前位置: 首页 > news >正文

Ansible(6)——管理变量

目录

一、Ansible 变量:

1、什么是变量:

2、变量可能包含的值:

3、变量命名:

4、定义变量:

二、Playbook 中的变量:

1、在 Playbook 中定义变量: 

(1)最简单的定义方式:

(2)外部文件中定义:

(3)文件中定义:

2、在 Playbook 中使用变量:

三、主机变量与组变量:

1、什么是主机变量与组变量:

2、定义主机变量与组变量:

(1)清单文件:

(2)⽬录:

四、管理变量:

1、从命令行覆盖变量:

2、将字典用作变量:

3、使用变量捕获命令输出行:


一、Ansible 变量:

1、什么是变量:

        Ansible ⽀持利用变量存储值,并在 Ansible 项⽬的所有⽂件中重复使用这些值,以简化项⽬的创建与维护,同时减少错误的数量。使用变量可以轻松地在 Ansible 项⽬中管理给定环境的动态值。

2、变量可能包含的值:

(1)要创建的用户;

(2)要安装的软件包;

(3)要重新启动的服务;

(4)要删除的⽂件;

(5)要从互联⽹检索的存档。

3、变量命名:

        变量名由字符串组成,必须以字母开头,并且只能由字母、数字和下划线组成

        以下是一些正确变量名与无效变量名的示例:

    无效变量名    有效变量名
  web server  web_server
  remote.file  remote_file
  1 file

  file_1

  file1
  remoteserver$1  remote_server_1
  remote_server1

4、定义变量:

        在Ansible 项目中,可以在多个位置定义变量,但不同位置具有不同的优先级

注:(1)建议选择全局唯一的变量名称;

       (2)如果在两个位置设置了同名变量,且变量值不同,此时通过优先级决定要使用哪个值。

        常用来定义变量的方法如下(按优先级从低到高排列):

(1)在清单中定义的组变量;

(2)在清单或 playbook 所在目录的 group_vars 子目录中定义的组变量;

(3)在清单中定义的主机变量;

(4)在清单或 playbook 所在目录的 host_vars 子目录中定义的主机变量;

(5)在运行时中发现的主机事实;

(6)playbook 中的 play 变量( vars 和 vars_files );

(7)任务变量;

(8)在命令行中定义的额外变量,使用 --extra-vars 或 -e 选项定义。

注:上述定义方法在下文中还有详细介绍。

二、Playbook 中的变量:

1、在 Playbook 中定义变量: 

        在编写 play 时,用户可以定义自己的变量,然后在任务中调用这些值。

(1)最简单的定义方式:

        playbook 变量可通过多种方式定义,最简单的方式是将它放在 playbook 开头的 vars 块中。 

(2)外部文件中定义

        也可以在外部文件中定义 playbook 变量。此时不使用 vars 块,而是在使用 vars_files 指令后,以 YAML 格式在文件中定义 playbook 变量。

(3)文件中定义:

        用户还可以使用 YAML 格式在这些⽂件中定义 playbook 变量。

2、在 Playbook 中使用变量:

        在声明了变量后,管理员可以在任务中使用这些变量。若要引用变量,可将变量名称放在双花括号( {{ }} 使用,在执行任务时,Ansible 会将变量替换为对应的值。

注:(1)建议为变量使用引号,以防止 Ansible 将变量视为 YMAL 字典的开头;

       (2)字典的相关内容在 Ansible(5)——编写 Playbook 这篇文章的第四部分(四、YAML 语法)中有详细介绍,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147005394

三、主机变量与组变量:

1、什么是主机变量与组变量:

        直接应用到主机的变量清单可以归为两大类:

(1)主机变量( host variables ): 应用到特定主机;

(2)组变量( group variables ):应用到某一主机或某组主机组中的所有主机。

注:主机变量优先于组变量,但 playbook 中定义的变量比这两者优先级更高。

2、定义主机变量与组变量:

(1)清单文件:

        定义主机变量和组变量的一种方法是直接在清单文件( inventory )中定义。这种方式比较老,结构性不好,但因为其把主机和主机组的所有清单信息与变量设置均放到一个文件中,所以目前仍在使用。

(2)⽬录:

        建议在与清单文件或目录相同的工作目录中,创建两个子目录 group_vars host_vars ,分别包含用于组变量和主机变量的定义文件。

注:不要直接在一个或多个清单文件中定义主机变量和组变量。

        为了定义用于主机的主机变量,需要在 host_vars 中创建名称与主机匹配的文件,来存放主机变量;为了定义 servers 组的组变量,需要创建名为 group_vars/servers 的 YAML 文件,使用与 playbook 相同的语法为变量赋值。

        还以上图中的内容为例:

        1)如果需要为两个数据中⼼的所有服务器定义⼀个通用值,可以为 datacenters 主机组设置⼀个组变量。

        2)如果需要为每个数据中心定义不同值,可以为每个数据中心主机组( datacenter1 、datacenter2 )设置组变量。

        3)如果需要为每⼀数据中⼼的各个受管主机( demo1.example.com 、demo2.example.com 、demo3.example.com 、demo4.example.com )定义不同,则在单独的主机变量⽂件中定义变量。

四、管理变量:

1、从命令行覆盖变量:

        inventory 变量可被 playbook 中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到 ansible 或 ansible-navigator run 命令来覆盖。

        在命令行上设置的变量称为额外变量。如果在运行 playbook 时需要针对单个主机变量进行覆盖,则可以使用额外变量。

2、将字典用作变量:

        除了将与同一元素相关的一组配置数据(软件包列表、服务列表和用户列表等)分配到多个变量外,管理员也可以使用字典做变量。

注: 字典的相关内容在 Ansible(5)——编写 Playbook 这篇文章的第四部分(四、YAML 语法)中有详细介绍,转跳链接如下:https://blog.csdn.net/m0_68756914/article/details/147005394

3、使用变量捕获命令输出行:

        管理员可以使用 register 语句捕获命令的输出,输出将保存在一个变量中,可用于调试或其他目的,例如输出命令的结果等。

        以上述 playbook 为例,运行该 play 时,register 语句会将对应输出保存在 install_result 变量中,debug 模块则将 install_result 注册变量的值转储到终端。

http://www.dtcms.com/a/122625.html

相关文章:

  • TDengine 数据模型设计:多列模式与单列模式对比(一)
  • UE5 matcap学习笔记
  • 单片机领域中哈希表
  • 基于 SpringBoot音乐网站与分享平台
  • 设计模式-命令模式详解
  • 大数据学习(104)-clickhouse与hdfs
  • Python web程序在服务器上面部署详细步骤
  • Java延迟队列
  • 铼赛智能Edge mini斩获2025法国设计大奖 | 重新定义数字化齿科美学
  • 深入解析 C++ 设计模式:原理、实现与应用
  • YOLOv12即插即用--CPAM
  • 【Kafka基础】消费者命令行完全指南:从基础到高级消费
  • 软考高级-系统架构设计师 案例题-软件架构设计
  • vue:前端预览 / chrome浏览器设置 / <iframe> 方法预览 doc、pdf / vue-pdf 预览pdf
  • 蓝桥杯 一年中的第几天(日期问题)
  • 如何运用浏览器进行各种调试?(网络、内存、控制台等调试用法)
  • 前端实战:基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化策略
  • Vert.x vs. Micronaut:2025年高并发Java框架选型指南
  • redisson常用加锁方式
  • 【代码模板】判断C语言中文件是否存在?错误:‘F_OK’未声明如何处理?(access;#include “unistd.h“)
  • 【智慧养猪场】-猪的行为分析视频数据集及展示(已做好分类)
  • C —— 宏
  • Redis-场景缓存+秒杀+管道+消息队列
  • 保留格式地一键翻译英文ppt
  • etf可以T+0交易吗?
  • 基础知识补充篇:什么是DAPP前端连接中的provider
  • 用网页JS实现数据添加和取出的操作,链表
  • Class 文件和类加载机制
  • 【10】数据结构的矩阵与广义表篇章
  • 聊透多线程编程-线程基础-3.C# Thread 如何从非UI线程直接更新UI元素