Ansible 之旅(十) Ansible Facts

Ansible Facts

Ansible Facts 是 Ansible 在托管主机上自动收集的变量。它是通过在执行 Ad hoc 以及 Playbook 时使用 setup 模块进行收集的,并且这个操作是默认的。因为这个收集托管主机上的 Facts 比较耗费时间,所以可以在不需要的时候关闭 setup 模块。收集的 Facts 中包含了托管主机特有的信息,这些信息可以像变量一样在 Play 中使用。

在收集的 Facts 中包含了以下常用的信息:
主机名
内核版本
网卡接口
IP 地址
操作系统版本
环境变量
CPU 数目
可用内存
可用磁盘

等等...
通过上面列举的信息,Facts 是一种非常方便的去确定托管主机的状态的方法,并且后续可以基于托管主机的状态需要执行何种操作

举个例子:

你需要在托管主机上部署 mariadb 数据库,在部署之前,需要满足 CPU 大于 2 核,可用内存大于 8G ,空闲磁盘满足 100G ,哪怎样判断托管主机是否满足要求呢?通过 shell 模块执行相应查询命令并且取值进行比较?显然是不合适的,工程量太大了。方便快速的方法就是通过 Facts 。上面提要的这些要求都可以在收集的 Facts 中找到,如果满足就安装,不满足则放弃安装。是不是非常简单?

需要注意的是,在 Ansible 2.3 版本中,在执行任何 Play 的第一个 Tasks 之前,都会自动的执行 setup 模块来采集 Facts ,如果使用较旧的版本可能需要手动的使用该模块进行收集,当然在 Ad Hoc 上也是如此。
下表整理了常用的 Facts 以及对应的变量名称:

Facts 变量名称
短主机名 ansible_hostname
完整主机名 ansible_fqdn
默认 IPv4 地址 ansible_defaultipv4.address
所有网卡名称 ansible_interfaces
vda 磁盘中的 vda1 分区大小 ansible_device.vda.partitions.vda1.size
DNS 列表 ansible_dns.nameservers
Kernel 版本 ansible_kernel

关闭 Facts 采集

前面介绍了在 Play 执行的时候收集 Facts 比较费时,如果在 Play 中不会用到 Facts ,那么可以在 Play 中进行关闭以提高速度。
如果需要在 Play 中关闭 Facts 可以在 Play 这一等级上配置 gather_facts: no 。如果在此 Play 中某个 Tasks 需要 Facts ,此时可以在 Tasks 中执行 setup 模块,但是如果出现这种情况,建议在前面就没有必要去关闭 Facts 收集了。

Facts 过滤

Ansible 默认收集的 Facts 包含了大量的信息,通常管理员需要的信息可能只是一部分,为了能够筛选出合适的信息,管理员可以使用 Ansible Facts 来过滤从托管主机收集的 Facts 。可以用在哪些情况呢?例如:
筛选网卡的信息
筛选磁盘的信息
筛选用户的信息

在 Play 中可以使用 setup 模块,在里面定义 filter 的值,如果是在 Ad Hoc 中使用 filter 的话,需要把一个表达式当作参数进行传递,例如:

# 只显示关于内存方面的 Facts
ansible all -m setup -a 'filter=ansible_*_mb'

另外默认来说收集 Facts 的超时时间是 10s ,如果需要更改超时时间可以通过 gather_timeout 参数进行设置。

自定义 Facts

除了托管主机默认的 Facts ,管理员也可以创建自定义的 Facts 保存在托管主机上。自定义的 Facts 也可以被 setup 进行收集,通过这种方式可以在托管主机上提供任意变量,用于调整 Play 的行为。
自定义 Facts 文件可以定义成静态文件,也可以定义成脚本。如果是静态文件,那格式应该是 INI 或者 Json 格式,如果定义成脚本,那么当这个脚本执行后可以产生 Json 格式的输出,就像动态 Inventory 一样。
自定义的 Facts 文件默认存放在托管主机的 /etc/ansible/facts.d 目录中,因为 setup 模块中 fact_path 的默认值就是这个目录。如果是静态文件的话,自定义 Facts 文件的后缀是 .fact
当已经自定好 Facts 文件后,通过 setup 模块收集的自定义 Facts 的值会存放在 ansible_local 这个变量中。
举个例子:

在托管主机中存在

/etc/ansible/facts.d/custom.fact

文件,内容如下:
[users]
User1 = joe
单收集到 Facts 后,在 Play 中就可以使用

ansible_local[custom]['users']['User1']

来获取到用户名 joe 。

魔术变量

在 Ansible 中存在一些特殊变量,它们不会被 setup 模块收集和配置,但是它们同样能够被 Ansible 自动设置,我们把这类变量称之为 Magic Variable(魔术变量)

以下是一些经常使用到的魔术变量:

魔术变量 用途
hostvars 包含托管主机的变量,也可以用于获取另外的托管主机变量
group_names 列出托管主机所在的所有组
groups 列出 inventory 中所有的主机和主机组
inventory_hostname 列出主机在 inventory 中定义的主机名

Ansible 提供了很多的魔术变量,查看更多的魔术变量可以访问:http://docs.ansible.com/ansible/playbooks_variables.html
查看魔术变量的值可以通过使用 debug 模块,如:

ansible localhost -m debug -a 'var=hostvars["localhost"]'
最后修改:2019 年 11 月 12 日 06 : 06 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论