《Ansible变量篇:ansible中事实变量facts》

一、简介

facts组件是ansible用于采集被管理机器设备信息的一个功能, 采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac地址,时间/日期相关数据,硬件信息等。

ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用,而setup模块获取这些信息的方法就是依赖于fact。

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

所以,在一些业务场景中,facts对我们是很有帮助的,省去了我们好多工作,大大提高了工作效率。


二、用法

2.1、通过setup查看变量

我们可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来过滤指定的信息。setup模块获取的整个facts信息被包装在一个json格式的数据结构中,ansible_facts是最外层的值。

《Ansible变量篇:ansible中事实变量facts》_第1张图片

由于输出的内容太多,所以这里只贴出部分内容,如下图所示:

《Ansible变量篇:ansible中事实变量facts》_第2张图片

我们可以使用filter参数来查看指定的信息,如下图所示:

在这里插入图片描述

注意:fact变量是通过setup模块来获取的,在playbook中调用的时候要以ansible_xxx开始,往下获取字典中的值,不要误以为是以ansible_facts开始往下取值的,不然会提示没有定义该变量。错误示例:ansible_facts.ansible_all_ipv4_addresses 。


2.2、通过playbook调用变量

运行一个收集事实并使用debug模块显示ansible_facts变量值的简短playbook,如下图所示:

《Ansible变量篇:ansible中事实变量facts》_第3张图片

输出结果,如下图所示:

《Ansible变量篇:ansible中事实变量facts》_第4张图片

Ansible事实变量示例:

事实 方式1 方式2 方式3
短主机名 ansible_facts.hostname ansible_facts[‘hostname’] ansible_hostname
完全限定域名 ansible_facts.fqdn ansible_facts[‘fqdn’] ansible_fqdn
IPv4地址 ansible_facts.default_ipv4.address ansible_facts[‘default_ipv4’]['address '] ansible_default_ipv4
所有网络接口的名称列表 ansible_facts.interfaces ansible_facts['interfaces '] ansible_interfaces
DNS服务器列表 ansible_facts.dns ansible_facts[‘dns’] ansible_dns
当前运行的内核版本 ansible_facts.kernel ansible_facts[‘kernel’] ansible_kernel

2.3、 set_fact跨playbook使用

在前面的playbook中定义的set_fact变量,可以在后面的playbook变量中直接调用。

《Ansible变量篇:ansible中事实变量facts》_第5张图片


三、配置

3.1、关闭set_fact

在Ansible的配置文件中,关于facts的重要配置项有以下几个:

gathering:facts的开关,默认是开启的;有以下三个取值:
	smart:开启facts信息收集,但是会优先使用facts缓存信息,可以使用gather_facts: False禁用facts收集;
	implicit:开启facts信息收集,要禁止收集,必须使用gather_facts: False;
	explicit:关闭facts信息收集,要显式收集,必须使用gather_facts: Ture。
	fact_caching:缓存facts信息的方式;可以配置成jsonfile或者redis;
fact_caching_connection:缓存插件的配置,针对不同的fact_caching方式,取值含义则不同:
	如果fact_caching为jsonfile,则此处应配置存储缓存文件的目录;
	如果fact_caching为redis,则此处应按照host:port:database的格式配置redis的信息。
gather_timeout:收集超时时间,默认为86400;
fact_caching_timeout:设置facts缓存的过期时间,默认是86400秒。

在执行ansible-playbook的时候,会卡一段时间,此时就是主控端在远程获取被控端的fact信息,如果不想从fact中获取变量,或者说整个playbook当中都没有使用到fact变量,可以通过如下方法关闭fact以提升执行效率。

方法一:在playbooks中关闭

《Ansible变量篇:ansible中事实变量facts》_第6张图片

方法二:在ansible.cfg配置文件中关闭

gathering = explicit

3.2、 启动fact缓存

如果在play中需要引入,则可以开启fact缓存。fact缓存目前支持三种存储方式,分别为JSON、memcached、redis。这里就以JSON为例:

vim ansible.cfg
# 加速执行ansible-playbooks
gathering= smart
fact_caching_timeout= 86400 
fact_caching=jsonfile
fact_caching_connection=/dev/shm/ansible_fact_cache

如下图所示:
fact


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:《Linux运维篇:Linux系统运维指南》

你可能感兴趣的:(ansible)