facts组件是ansible用于采集被管理机器设备信息的一个功能, 采集的机器设备信息主要包含IP地址,操作系统,以太网设备,mac地址,时间/日期相关数据,硬件信息等。
ansible有一个模块叫setup,用于获取远程主机的相关信息,并可以将这些信息作为变量在playbook里进行调用,而setup模块获取这些信息的方法就是依赖于fact。
那么话又说回来了,采集这些信息有什么用呢?有的时候我们需要根据远程主机的信息作为执行条件操作。例如,根据远程服务器使用的操作系统版本,可以安装不同版本的软件包;或者也可以显示与每台远程计算机相关的一些信息,例如每台设备上有多少RAM内存可用。
所以,在一些业务场景中,facts对我们是很有帮助的,省去了我们好多工作,大大提高了工作效率。
我们可以使用setup模块获取被管理机器的所有facts信息,可以使用filter来过滤指定的信息。setup模块获取的整个facts信息被包装在一个json格式的数据结构中,ansible_facts是最外层的值。
由于输出的内容太多,所以这里只贴出部分内容,如下图所示:
我们可以使用filter参数来查看指定的信息,如下图所示:
注意:fact变量是通过setup模块来获取的,在playbook中调用的时候要以ansible_xxx开始,往下获取字典中的值,不要误以为是以ansible_facts开始往下取值的,不然会提示没有定义该变量。错误示例:ansible_facts.ansible_all_ipv4_addresses 。
运行一个收集事实并使用debug模块显示ansible_facts变量值的简短playbook,如下图所示:
输出结果,如下图所示:
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 |
在前面的playbook中定义的set_fact变量,可以在后面的playbook变量中直接调用。
在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.cfg配置文件中关闭
gathering = explicit
如果在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
如下图所示:
更多详细内容请参考:《Linux运维篇:Linux系统运维指南》