一、Ansible变量管理

1、变量概述

  • Ansible支持利用变量来存储值,并在Ansible项目的所有文件中重复使用这些值。这可以简化项目的创建和维护,并减少错误的数量
  • 通过变量,可以轻松地在Ansible项目中管理给定环境的动态值

2、变量命令规范

  • 变量只能包含字母、数字和下划线
  • 变量不能以数字开头

3、变量的定义

  • Ansible项目中可以在多个位置定义变量
  • Ansible变量的三大范围
    • 全局范围:从命令行或Ansible配置设置的变量
    • Play范围:在playbook和相关结构中设置的变量
    • 主机范围:由清单、事实收集或注册的任务,在主机组和个别主机上设置的变量
  • 变量优先级:越小越优先(小指的是范围;越靠近使用的值,优先级越高)

二、在Playbook中设置变量

1、使用INI类型定义变量(将变量放在playbook开头的vars块中)

---
- hosts: all
vars:
user: lisi
home: /home/lisi

2、使用YAML类型定义变量(使用vars_files关键字,后面跟上相对于playbook位置的外部变量文件名称列表)

---
- hosts: all
vars_files:
- vars/users.yml //也可以使用绝对路径;使用相对路径则必须将vars目录到与Playbook文件所在相同的目录下

3、在Playbook中使用变量

声明了变量后,可以在任务中使用这些变量;若要引用变量,可以将变量名放在双大括号内“{{ }}”

---
- hosts: all
vars:
user: joe
tasks:
- name: Create the user {{ user }}
user:
name: "{{ user }}" //如果大括号前面有内容,则不需要加引号

三、主机变量和主机组变量

1、应用于主机变量的分类

  • 主机变量,应用于特定主机
  • 组管理,应用于一个主机组或一组主机组中的所有主机
  • 主机变量优先于组变量,但playbook中定义的变量的优先级比这两者更高

2、定义特定主机变量

[servers]
192.168.121.10 ansible_user=root

3、定义主机组变量

[servers]
192.168.121.81
192.168.121.82 [servers:vars]
user=lisi
//创建主机组变量后改组内的主机都可以使用user变量

4、使用目录添加主机和主机组变量

  • 定义主机和主机组的变量的首选做法是在与清单文件或其所在目录相同的目录中,创建host_varsgroup_vars两个目录
  • 建议的做法是使用在host_varsgroup_vars目录中定义清单变量,而不直接在清单文件中定义它们(目录名必须是host_vars、group_vars
  • 可以单独对特定主机定义变量、可以对主机组设置变量、可以对主机组里面的每个主机定义变量
  • 演示实例:例如在一个场景中,需要管理两个数据中心,并在/etc/ansible/inventory清单文件中定义数据中心主机
    [root@localhost ~]# vim /etc/anisble/inventory
    [datacenter1]
    node1.example.com
    node2.example.com [datacenter2]
    node3.example.com
    node4.example.com [datacenters:children] //表示datacenters组包含上面的两个主机组
    datacenter1
    datacenter2

四、使用其他方式设置变量

1、从命令覆盖变量(也可以定义临时的变量)

  • 清单变量可被playbook中设置的变量覆盖,这两种变量又可通过在命令行中传递参数到ansibleansible-playbook命令来覆盖,在命令行上设置的变量称为额外变量
  • 演示实例:
    [root@localhost ~]ansible-playbook test.yml -e "user=apache2"

2、使用数组作为变量

  • 除了将同一元素相关的配置数据(软件包列表、服务列表和用户列表等)分配到多个变量外,也可以使用数组。这种做法的一个好处在于,数组是可以浏览的
  • 演示实例:
     //定义一个数组
    users:
    zhangsan:
    first_name: san
    last_name: zhang
    home_dir: /home/zhangsan lisi
    first_name: si
    last_name: li
    home_dir: /home/lisi
  • 演示使用变量来访问用户数据:
    ---
    - hosts: all
    vars:
    - users: //数组名称(自定义)
    first_user: //该数字里面第一个用户变量
    full_name: zhangsan
    dir_name: /tmp/zhangsan
    secend_user:
    full_name: lisi
    dir_name: /tmp/lisi
    tasks:
    - name: create user zhangsan
    user:
    name: users['first_user']['full_name']
    state: present - name: create user lisi
    user:
    name: users['secend_user']['full_name']
    state: present
    //也可以在外部使用变量文件来自定义数组,只需在playbook文件里面引用即可
  • 注意事项:
    • 如果键名与python方法或属性的名称(如discard、copyadd)相同,点表示法可能会造成问题
    • 建议在任何给定Ansible项目的所有文件中一致地采用一种语法,不要混用

3、使用已经注册的变量打印输出结果

  • 使用register语句捕获命令输出
  • 输出保存在一个临时变量中,然后在playbook中可用于调试用途(debug模块)或者达成其他目的,例如:基于命令输出的特定配置
  • 演示实例:
    [root@localhost ~]# vim /etc/ansible/playbook.yaml
    ---
    - hosts: all
    tasks:
    - name: create user
    user:
    name: "{{ user }}"
    create_home: no
    state: present register: result //result表示输出结果,变量名可以任意取 - name: abc
    debug: var=result //变量值=上面的变量(打印输出结果)
  • 运行该playbook时,debug模块用于将result注册变量的值转储到终端
    [root@localhost ~]# ansible-playbook -C /etc/ansible/playbook.yaml 
    
    PLAY [client.example.com] *************************************************************************************************************************************************
    
    TASK [Gathering Facts] ****************************************************************************************************************************************************
    ok: [client.example.com] TASK [create user] ********************************************************************************************************************************************************
    changed: [client.example.com] TASK [abc] ****************************************************************************************************************************************************************
    ok: [client.example.com] => {
    "result": {
    "changed": true,
    "failed": false
    }
    } PLAY RECAP ****************************************************************************************************************************************************************
    client.example.com : ok=3 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Ansible_变量管理与设置的更多相关文章

  1. Tesnsorflow命名空间与变量管理参数reuse

    一.TensorFlow中变量管理reuse参数的使用 1.TensorFlow用于变量管理的函数主要有两个:  (1)tf.get_variable:用于创建或获取变量的值  (2)tf.varia ...

  2. Atititcmd cli环境变量的调用设置与使用

    Atititcmd cli环境变量的调用设置与使用 1.1. Cgi 环境变量的调用设置与使用1 1.2. 环境变量vs  系统变量1 1.3. 环境变量的分类 A.与服务器相关的环境变量B ,与客户 ...

  3. 【转】Mac OS X 中 Zsh 下 PATH 环境变量的正确设置

    在 Mac OS X 中使用 zsh,环境变量 PATH 一不小心就会变得很紊乱,表现为自己设置的路径总是被放到系统路径之后,部分路径还会有重复.这是我们不太了解 zsh 启动时加载文件的顺序和 Ma ...

  4. 在ASP.NET Core配置环境变量和启动设置

    在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...

  5. VSCode的Python扩展下程序运行的几种方式与环境变量管理

    在VSCode中编写Python程序时,由于有些地方要使用环境变量,但是发现设置的环境变量有时不起作用,花了点时间研究了一下,过程不表,直接说结论. 首先,环境变量的设置,Python扩展中有三种方式 ...

  6. 集成direnv 与docker-compose 进行环境变量管理

    direnv 是一个不错的换将变量管理工具,同时日常的开发测试中我们使用docker-compose 会比较多,一般我们的玩法是 可以再docker-compose 中指定环境变量,可以通过envir ...

  7. direnv 一个强大的环境变量管理工具

      direnv 是一个基于golang 编写的强大的环境变量管理工具,可以帮助我们简化环境变量管理,而且 支持的平台比较多. 基本使用 下载二进制软件包 https://github.com/dir ...

  8. ASP.NET Core配置环境变量和启动设置

    在这一部分内容中,我们来讨论ASP.NET Core中的一个新功能:环境变量和启动设置,它将开发过程中的调试和测试变的更加简单.我们只需要简单的修改配置文件,就可以实现开发.预演.生产环境的切换. A ...

  9. windows 中 到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe windows/system32

    到底是用的哪个java.exe??? 删除了PATH变量的Java设置还是可以运行java.exe JavaWindowsCC++C#  当电脑里面有多个jdk或是jre时,在cmd里面到底是用的哪个 ...

随机推荐

  1. MyBatis-Plus日常工作学习

    一:Mybatis-Plus概述 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis ...

  2. Linux 用户和用户组管理(useradd userdel groupadd groupdel)

    Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. Linux系统用户账户的 ...

  3. JMeter自定义采样器插件开发

    JMeter自定义采样器插件开发 目录 JMeter自定义采样器插件开发 1. 简介 2. 需求简介 3.成品展示 成功展示 失败展示 4. 准备开发环境 4.1 准备pom文件 4.2 新建Java ...

  4. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...

  5. Linux下禁用笔记本触摸板

    1 概述 在Linux下禁用触摸板的方法有很多,这里列举三种: 图形界面配置关闭 modprobe关闭 xinput关闭 2 图形界面配置关闭 笔者的环境为Manjaro+Xfce,其他的桌面也应该类 ...

  6. 开源Influxdb2高性能客户端

    前言 最近我在了解时序数据库Influxdb 2.x版本,体验一翻之后,感觉官方的出品的.net客户端还有很多优化的地方,于是闭关几天,不吃不喝,将老夫多年练就的高性能网络通讯与高性能Buffer操作 ...

  7. mvnw 找不到或无法加载主类,找不到符号,类

    如果你出现"找不到或无法加载主类"的问题,很有可能是maven的问题,你可以尝试一下这种办法: 问题:关于maven什么东西都没动,上午可能运行都好好的,下午可能就出现了这个问题, ...

  8. Laravel结构生成器

    简介 Laravel 的 Schema 类提供了一种与数据库无关的方式维护表.它和 Laravel 所支持的所有数据库都能很好的工作,并且提供了统一的接口. 创建和删除表 使用 Schema::cre ...

  9. 「编程羽录」上线,程序员必备的这些技能你能get到嘛?

    大家好,我是小羽. 好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章. 会为大家提供一些技术栈之外,程序员还需要的其他方面硬核知识,做到全 ...

  10. Python中面向对象和类

    目录 面向对象 类的定义 类的访问 类的属性和方法 继承和多态 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象: 类(C ...