ansible-playbook-facts

Facts 收集系统信息,在运行任何一个Playbook之前,Ansible默认会先抓取 Playbook 中所指定的所有主机的系统信息,这些信息我们
称之为 Facts。

Facts 信息

在运行的所有 Playbook 任务中,都会出现类似下面代码的内容:

1
# ansible-playbook playbook.yml

上述命令的运行结果如下:

1
2
3
4
5
PLAY [group] **********************************************************
GATHERING FACTS *******************************************************
ok: [host1]
ok: [host2]
ok: [host3]

Facts 信息包括(但不仅限于)远程主机的 CPU 类型、IP 地址、磁盘空间、操作系统信息以及网络接口信息等,这些信息对于 Playbook
的运行至关重要。我们可以根据这些信息来决定是否要继续运行下一步任务,或者将这些信息写入某个配置文件中。
可用使用 setup 模块来获取对应主机上面的所有可用的 Facts 信息。比如:

1
# ansible my_test -m setup

运行结果如下:

1
2
3
4
5
6
172.28.7.238 | SUCCESS => {
"ansible_facts": {
"ansible_all_ipv4_addresses": [
"172.28.7.238"
],
......

在某些用不到 Facts 信息的 Playbook 任务中,我们可以在 Playbook 中设置gather facts: no 来暂时让 Ansible 在执行 Playbook
任务之前跳过收集远程主机 Facts 信息这一步,这样可以为任务节省几秒钟的时间,如果主机数量多的话,就能节省更多的时间。在
Playbook 中设置 gather
facts 的方法如下:

1
2
- hosts: db
gather_facts: no

在实际应用当中,运用得比较多的 Facts 变量有 ansible_os_family、ansible_hostname、ansible_memtotal_mb 等,这些变量通常会
被拿来用作 when 语句的判断条件,来决定下一步的操作。

注意:
如果远程主机上安装了 Facter 或 Ohai,那么 Ansible 将会把这两个软件所生成的 Facts 信息也给收集回来,Facts 变量名分别以
facter 和 ohai 开头进行标示。如果你的环境中还有 Puppet 或者 Chef 等管理 工具,那么也可以使用 Ansible 便捷地获取它们的
Facts 信息。但是,通常情况下, Ansible 自己的 Facts 变量就已经足够满足需求了。
Playbook 在不同的操作系统上获取到的 Facts 变量的格式是不一样的, 这一点在使用的过程务必多加注意。

本地Facts变量

可以把需要定义的变量写进一个以 .fact 结尾的文件中,这个文件可以是 JSON 文件或 INI 文件,或者是一个可以返回 JSON 代码的
可执行文件。然后将其放置在/etc/ansible/facts.d 文件夹中,Asnible 在执行任务时会自动到这个文件夹下读取变量信息。

比如,我们在远程主机上创建了一个 .fact 文件/etc/ansible/facts.d/settings.fact,文件内容如下:

1
2
3
[users]
admin=layne,john
normal=jim

接下来,使用 setup 模块就可以读取到这两个变量,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
# ansible my_test -m setup -a 'filter=ansible_local'
172.28.7.238 | SUCCESS => {
"ansible_facts": {
"ansible_local": [
"settings":{
"users": {
"admin": "layne,john",
"normal": "jim"
}
}
],
"changed": false

如果在一个 Playbook 中,只有部分 Playbook 任务用到了远程主机自定义的本地 Facts,那么我们可以使用下面一段代码来明确地指明
只显示这些本地 Facts:

1
2
- name: 重新获取本地Facts
setup: filter=ansible_local

注意:
定义本地 Facts 的方法通常作为一种临时的定义变量的手段,我们还是建议将变量集中定义在 Asnsible 服务器端集中管理。但是在某
些特殊情况下,比如远程主机的系统环境经常发生变化,我们就需要在/etc/ansible/facts.d 下使用脚本文件来动态地生成 Facts 变
量。其他大部分情况下,都建议将变量以各种形式集中定义在 Ansible 服务器端。

setup 模块的 filter 功能,目前暂不支持 Windows 系统。