一、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. 【Java】 5.0 判断与转换

    [概述] 在if/条件语句中,我们已经谈及判断了,这次将详细讲讲一些逻辑判断 基本逻辑 &:且,And,需要二者均为True |:或,Or ,需要二者其一为False即可 ^:异或,XOE,两 ...

  2. JDK8中新日期时间API

    它们面临的问题是:可变性:像日期和时间这样的类应该是不可变的.偏移性:Date中的年份是从1900开始的,而月份都从0开始.格式化:格式化只对Date有用,Calendar则不行.此外,它们也不是线程 ...

  3. [开源]制作docker镜像不依赖linux和Docker环境

    背景 最近群友们经常反馈docker镜像制作起来有点麻烦,我开源的antdeploy工具虽然可以制作镜像但是必须有一个提前:有一台安装好docker的linux服务器.因为大家开发环境基本上都是win ...

  4. Magicodes.IE.ASPNETCore之多样化接口使用

    1.安装包 Install-Package Magicodes.IE.AspNetCore 2.开始配置 在Startup.cs的Configure()方法中,在UseRouting()中间件之后,注 ...

  5. Day12 _63_获取当前线程对象

    给线程起名 * 1. Thread.currentThread(); 可以获取到当前线程对象,出现在哪就是获取哪个线程. * 2. thread.setName(); 给该线程起名字 * 3. thr ...

  6. 【SpringBoot】SpringBoot2.x整合Shiro(一)

    一:什么是ACL和RBAC: ACL: Access Control List 访问控制列表 以前盛行的一种权限设计,它的核心在于用户直接和权限挂钩 优点:简单易用,开发便捷 缺点:用户和权限直接挂钩 ...

  7. 【并发编程】线程池是否需要手动关闭吗?以Hutool中的线程池为例

    Hutool工具包中使用线程池的API是: ThreadUtil.execute() /** * 直接在公共线程池中执行线程 * * @param runnable 可运行对象 */ public s ...

  8. 【转】在CentOS 8 / RHEL 8上配置主/从BIND DNS服务器

    转自: https://zh.codepre.com/centos-2700.html 前言 本指南描述了在CentOS 8 / RHEL 8 Linux上配置BIND DNS服务器所需的步骤.在Ce ...

  9. Android Linker 与 SO 加壳技术

    1. 前言 Android 系统安全愈发重要,像传统pc安全的可执行文件加固一样,应用加固是Android系统安全中非常重要的一环.目前Android 应用加固可以分为dex加固和Native加固,N ...

  10. Python中pip安装报错Unable to create process using '....'

    因为我本人在电脑上安装了python2和python3,所以在安装的时候,把两个python的安装目录都安装到G盘了.然后两个python的执行文件分别改成了 python2.exe 和  pytho ...