首页 > 其他分享 >Ansible 魔法变量(magic variables)和Facts变量

Ansible 魔法变量(magic variables)和Facts变量

时间:2022-10-29 09:55:29浏览次数:53  
标签:Ansible magic 变量 variables Facts ansible facts

Ansible Facts要这样玩才让人心服

Ansible体系文章,IT民工金鱼哥希望能以通俗易懂、诙谐幽默的方式给大家呈现这些枯燥的知识点,让繁重的学习变的有趣一些。

1. 前言描述

在Ansible执行时,默认总有一个任务会先运行,那就是Gathering Fact:

TASK [Gathering Facts] ****************************************
ok: [192.168.xxx.xxx]

从输出内容来看,这是执行了一个名为Gathering Facts的TASK,但其实我们并没有在命令中或者剧本中定义这个任务,这个是Ansible设计的初衷,默认情况自动执行。

2. Ansible Facts简介

Ansible Facts(事实)是Ansible在受管主机上自动检测到的变量。而Facts组件是Ansible用于采集被管理机器设备信息的一个功能,采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac 地址,时间/日期相关数据,硬件信息等。

那么,采集这些信息有什么用呢?有的时候我们需要根据远程主机的信息作为执行条件操作,例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包;或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少RAM可用。

所以在一些业务场景中, Ansible Facts对我们使用是很有帮助的,直接调用以大大提高了工作效率。

22

3. Ansible facts示例

可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来查看指定的信息。setup模块获取的整个facts信息被包装在一个JSON格式的数据结构中,ansible_facts是最外层的值。我们可以通过以下Ansible Ad-Hoc命令查看facts信息:

[root@servera ~]# ansible localhost -m setup
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.168.159.111"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::2a9:fbb5:c93:84f8"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "07/29/2019", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
............

4. 过滤Facts变量

收集到的事实太多而不方便查找的时候,我们可以进行过滤刷选想要的信息:

ansible localhost -m setup -a 'filter=ansible_fqdn'

5. 新旧语法对比

前面也提及到,Ansible Facts是Ansible在受管主机上自动检测到的变量,所以当需要调用这些变量的值,就涉及到如何书写的问题,在2.5版本前,是以下表旧的形式来进行调用,虽然官方建议使用新的形式进行编写,但其实两种形式写法都可以(官方未提及是否颓弃旧的写法)。

ANSIBLE_FACTS 形式旧事实变量
ansible_facts['hostname'] ansible_hostname
ansible_facts['fqdn'] ansible_fqdn
ansible_facts['default_ipv4']\['address'] ansible_default_ipv4['address']
ansible_facts['interfaces'] ansible_interfaces
ansible_facts['devices']\['vda']\['partitions]\['size'] ansible_devices['vda']\['partitions]\['size']
ansible_facts['dns']\['nameservers'] ansible_dns['nameservers']
ansible_facts['kernel'] ansible_kernel

如果变量的值为散列/字典,则可使用两种语法来检索该值。从上表中举两个例子:

ansible_facts['default_ipv4']['address'] 可以写成 ansible_facts.default_ipv4.address
ansible_facts['dns']['nameservers'] 可以写成 ansible_facts.dns.nameservers

6. 关闭Facts收集

收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。

关闭facts收集以后,playbook启动的时间会变快

- hosts: dev
  gather_facts: no
  tasks:	
  - debug:
     msg: "closeed facts"

7. 魔法变量

有些特殊变量,名为:魔法变量(magic variables)

官网地址:https://docs.ansible.com/ansible/latest/user_guide/playbooks_vars_facts.html#information-about-ansible-magic-variables

常见魔法变量:

  • hostvars

包含受管主机的变量,可以用于获取某台受管主机的变量的值。如果有一台web服务器的配置文件中需要指定db服务器的ip地址,我们假定这台db服务器的hostname为 db.example.com ,ip地址绑定在eth0网卡上,我们可以通过如下方法在web服务器上调用db服务器的ip地址:

{{ hostvars['db.example.com'].ansible_eth0.ipv4.address }}
  • group_names

列出当前受管主机所属的所有组 (用于标识当前正在执行task的目标主机位于的组) 。

  • groups

列出清单中的所有组和主机。

  • inventory_hostname

列出inventory主机清单文件中的主机名称。

其余魔法变量:

77


一眼看上去,完全不明所以,还是通过练习来辅助理解才行:

[student@servera example]$ cat hosts
servera
serverb
serverc
serverd

[dev]
serverb

[test]
serverc

[pro]
serverd

[student@servera example]$ cat ansible.cfg 
[defaults]
inventory = hosts
[student@servera example]$ cat magic.yml 
---
- name: magic vars
  hosts: serverc
  gather_facts: no
  tasks:
    - name: show magic fact inventory_hostname
      debug:
        var: inventory_hostname
# 调用魔法变量inventory_hostname,演示主机清单文件中的主机名称。

    - name: show magic fact groups
      debug:
#        var: groups.test
        var: groups.dev
# 调用魔法变量groups,此处还为散列字典,对应清单中所属的主机组。

    - name: show magic fact group_names
      debug:
        var: group_names
# 调用魔法变量group_names,列出当前受管主机所属的所有组 。

    - name: show magic fact hostvars
      debug:
        var: hostvars.serverb.ansible_forks
# 调用魔法变量hostvars,也为散列字典,需要编写对应主机的相关变量信息。
[student@servera example]$ ansible-playbook magic.yml 

PLAY [magic vars] ***********************************************************************

TASK [show magic fact inventory_hostname] ***********************************************
ok: [serverc] => {
    "inventory_hostname": "serverc"
}

TASK [show magic fact groups] ***********************************************************
ok: [serverc] => {
    "groups.dev": [
        "serverb"
    ]
}

TASK [show magic fact group_names] ******************************************************
ok: [serverc] => {
    "group_names": [
        "test"
    ]
}

TASK [show magic fact hostvars] *********************************************************
ok: [serverc] => {
    "hostvars.serverb.ansible_forks": "5"
}

PLAY RECAP *****************************************************************************************
serverc : ok=4   changed=0   unreachable=0   failed=0   skipped=0   rescued=0   ignored=0

通过上面输出应该比较清晰的了解到魔法变量究竟是怎样的,在日后的使用中,若忘记,也可以直接编写debug模块来进行测试输出。有时候学习需要运用各种方式来辅助自己。

image-20211208170619717

标签:Ansible,magic,变量,variables,Facts,ansible,facts
From: https://www.cnblogs.com/sword0077/p/16838102.html

相关文章

  • CF878D Magic Breeding
    不妨考虑一种特殊情况,权值为\(0/1\)如何求解?此时\(k\)个数可以表示为\(n\)位二进制数,注意到位是独立的,将每一位拆开后最多只会有\(\min(2^k,n)\)种不同的情况。......
  • 【JS】大道至简---来看看JS中你最熟悉的变量和数值的知识吧
    1变量1.1什么是变量?变量就是一个装东西的盒子。变量是用于存放数据的容器。我们通过变量名获取数据,数据可以被更改。1.2声明变量1.2.1定义单个变量js通过var来声明变量,v......
  • Qt中全局变量的定义和使用
    全局变量的定义 现在需要将自定义的STRParameter变量定义为全局变量,就需要新建两个文件,分别命名为"global.h"和"global.cpp" 在global.h文件中对全局变量进......
  • iOS XCode环境变量
    环境变量解释说明$(SRCROOT)工程所在位置,也就是.xcodeproj所在目录$(PROJECT_DIR)与$(SRCROOT)一样$(TARGETNAME)工程名称$(TARGET_BUILD_DIR)目......
  • C语言习题:使用指针交换两个变量的数据
    题目在主程序通过键盘输入两个正整数,编写并调用自定义函数voidswap(int*x,int*y)实现两个整数变量值的交换并输出交换后的结果。代码#include<stdio.h>voidswap(......
  • tmagic-editor本地运行
    直接用官网或git上的教程不能直接本地运行起来,要按照以下步骤才可以:1、在github下载好代码2、按照github提示那样,分别npminstall-gpnpm、pnpmbootstrap,先不要pnpmpl......
  • 金蝶K3 V15 Win10x64 导出xlsx提示“未设置对象变量或 With block 变量”解决
     安装了Office2019x64Pro版,金蝶K3导出物料时选择xls2003版无错误提示,但选择高版本Officexlsx时则出现提示报错。原因时没有安装对应的数据库引擎:AccessDatabaseE......
  • idapython修复全局变量段未识别指针
    idapython修复全局变量段未识别指针  在逆向的过程中,经常会遇到虚表或者指针数组的实现,这种时候在回溯一些危险函数调用的时候,经常找不到交叉引用,这里记录一下,下次......
  • VS2017调试代码显示变量值为无法获取本地变量或参数的值,因为它在此指令指针中不可用,可
    问题:最近在开发过程中,遇到在Debug模式进行断点调试中,监控你变量对象时看不到值,提示如下:“无法获取本地变量或参数的值,因为它在此指令指针中不可用,可能是因为它已经被优化......
  • 不利用第三个数,将两个变量的值交换
    inta=3,b=4;a=a+b;b=a-b;a=a-b;第一行:用于定义a和b的值第二行:将a和b的值相加,得到和,即为7第三行:将b的值与总和做差,即可得到原定义的a值,即3第四......