Ansible创建自定义fact示例
Ansible facts
是用于管理节点的系统信息的术语。现在系统信息可以是关于操作系统分布、发布、处理器、IP地址等。收集这些远程系统信息的任务称为"收集fact",收集的数据或者收集的信息称为fact或者变量。我们使用 setup
模块从受管节点收集fact。
注:
Ansible playbooks将在默认情况下调用 setup
模块收集每次执行的fact。
fact有两种
系统默认fact
用户定义的fact
系统默认fact
在握手过程中,托管主机会自动发现并向Ansible提供系统中的大量数据。这些数据非常有用,可以告诉我们该系统的所有信息,例如:
主机名、网络接口和IP地址
系统架构
操作系统
磁盘驱动器
使用的处理器和内存量
是否是虚拟机;如果是,是否是虚拟化/云提供商?
你可以用 setup
带有特殊命令的模块
[ansible@controller ~]$ ansible server2 -m setup
这将为server2
提供一个很长的值列表 . 我们可以在设置模块中进一步添加过滤器,以仅获取所需的数据。
在本例中,我只希望获得已安装内核的详细信息
[ansible@controller ~]$ ansible server2 -m setup -a 'filter="ansible_kernel"' server2 | SUCCESS => { "ansible_facts": { "ansible_kernel": "4.18.0-193.6.3.el8_2.x86_64", "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false }
我们可以查看 -m setup
并选择字典键将其用作筛选器。更多关于 setup
模块和可用的过滤器,我们可以按照官方的ansible文档
用户定义的fact
在本节中,我们将创建一些用户定义的fact,这些fact可以由playbooks使用。这绝对不是强制性的,根据要求,我们可以选择创建自定义fact。
为了创造习惯fact,我们必须创造
/etc/ansible/facts.d
在各自的受管节点上内部
facts.d
我们可以放置扩展名为的fact文件的目录.fact
- 这些fact文件的格式必须是JSON或者字典格式。fact文件必须具有可执行权限
我们将使用ansible创建 fact
脚本。为了演示,我只使用 server2
但我们可以使用所有托管节点。
首先让我们在上创建一个目录 server2
[ansible@controller ~]$ ansible server2 -m file -a "path=/etc/ansible/facts.d state=directory" --become
现在,我将在我的ansible引擎上本地创建一个fact文件,我将使用ansible将其复制到托管节点。以下是我的fact档案 /tmp/python_version.fact
它将收集python版本:
#!/bin/bash python_ver=$(python3 --version | cut -d' ' -f2) cat << EOF { "Python_version": "${python_ver}" } EOF
此脚本将收集python版本,然后以JSON格式打印输出。
所以我们要把这个文件复制到 server2
使用ansible并将用户和组所有者修改为具有文件权限的ansible 700
仅此而已 ansible
无法访问此文件。
[ansible@controller ~]$ ansible server2 -m copy -a "src=/tmp/python_version.fact dest=/etc/ansible/facts.d/ mode=700 owner=ansible group=ansible" --become
验证上的文件 server2
[ansible@server-2 ~]$ ls -l /etc/ansible/facts.d/python_version.fact -rwx------ 1 ansible ansible 113 Sep 20 02:49 /etc/ansible/facts.d/python_version.fact
现在我们只能收集这个过滤器的fact
[ansible@controller ~]$ ansible server2 -m setup -a "filter=ansible_local"