Ansible创建自定义fact示例

时间:2020-01-09 10:37:07  来源:igfitidea点击:

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"