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']
魔术变量
在 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"]'
评论已关闭