当我们运行一个playbook时,默认都会运行一个名为”[Gathering Facts]“的任务,前文中已经大致的介绍过这个默认的任务。ansible通过”[Gathering Facts]“这个默认任务收集远程主机的相关信息(例如远程主机的IP地址,主机名,系统版本,硬件配置信息),其实,这些被收集到远程主机信息回保存在对应的变量中,当我们想要使用这些信息时,我们可以获取对应的变量,从而使用这些信息。

如果想要查看”[Gathering Facts]“任务收集的信息内容,我们可以借助一个模块:setup模块

当执行playbook时,playbook其实就是自动调用了setup模块从而执行了”[Gathering Facts]“任务,所以我们可以通过手动执行setup模块查看”[Gathering Facts]“任务收集到的信息。示例如下:

#ansible  pro -m setup

上面的命令表示收集pro主机的相关信息,执行上述命令后,远程主机pro的相关信息将会输出到ansible主机的控制台上,返回的信息的格式是json格式。

返回的信息很多,并不是我们每一次都需要这么多信息,如果你只是想要查看某一些信息,你可以通过关键字对信息进行过滤,比如,我只是想要查看远程主机的内存配置信息,那么我使用如下命令:

image.png

除此之外还可以使用通配符进行相对模糊的过滤。


其实,除了这些信息以外,我们还能在远程主机中写入一些自定义的信息,这些自定义信息也可以被setup模块收集到。

那么我们应该在哪些定义这些信息呢?

ansible默认会去目标主机的/etc/ansible/facts.d目录下查找主机中的自定义信息,并且规定,自定义信息需要写在以”.fact“为后缀的文件中,同时,这些以”.fact"为后缀的问句中的内容需要是INI格式或者是json格式的。

我们创建一个测试文件,测试文件路径为pro主机的/etc/ansible/facts.d/testinfo.fact,在文件中写入INI格式,如下:

INI格式如下:

image.png

json格式:

anisble变量二(针对默认收集的信息处理)_第1张图片


通过上述方式,我们可以在目标主机的本地自定义信息,这些在远程主机本地自定义的信息被成为”local facts“,当我们运行setup模块时,远程主机的”local facts“信息也会被收集,我们可以通过”ansible_local“关键字过滤远程主机的”local facts“信息,示例命令如下:

anisble变量二(针对默认收集的信息处理)_第2张图片

当setup收集远程主机的”local facts“时,默认会查找远程主机的/etc/ansible/facts.d目录,如果将facts信息文件放在了其他自定义路径,在使用setup模块时,需要使用fact_path参数指定对应的路径,假设我们放在了目录主机的’/testdir‘目录下:命令如下:

#ansible pro -m setup -a "fact_path=/testdir"


另一个模块,debug模块。

见名知意,debug模块的作用就是帮助我们进行调试,debug模块可以帮助我们把信息输出到ansible控制台,以便定位问题。

debug模块的playbook小示例,如下:

anisble变量二(针对默认收集的信息处理)_第3张图片

当然,使用debug的msg参数时也可以引用变量的值,这样我们自定义的信息就更加灵活了,示例如下:

anisble变量二(针对默认收集的信息处理)_第4张图片


之前说过playbook在运行默认都会运行"Gathering Facts"任务,然后会收集远程主机的相关信息,这些信息会保存在对应的变量中,我们在playbook中可以使用这些变量,比如“ansible_memory_mb”就是一个变量名,我们可以在playbook中直接引用名为"ansible_memory_mb",从而获取到远程主机的内存信息,示例如下:

anisble变量二(针对默认收集的信息处理)_第5张图片

执行效果如下:

anisble变量二(针对默认收集的信息处理)_第6张图片

如上述返回信息所以,ansible_memory_mb中其实包含了”nocache“,”real“,”swap“三个部分的信息,如果我们只想获得’readl‘部分的信息,在playbook中引用变量时可以使用如下两种语法:

语法一:

image.png

语法二:

image.png

其实这些远程主机的信息不仅仅能够用于输出,我们通过会获取这些信息以后,对这些信息的值进行判断,如果符合我们条件,然后再执行下一步动作,比如:先获得远程主机的系统发行版信息,然后判断是什么系统,然后根据不同的系统进行不同的操作。