在这篇文章中,我们将一步步带你了解如何使用setup模块来收集主机信息,并且还会对比一下使用ansible命令和ansible-playbook这两种不同方法的优劣。

在Ansible中,setup模块是一个非常有用的工具,可以帮助你轻松地收集目标主机的各种系统信息。无论是想了解操作系统的版本、内存容量、CPU性能还是网络配置,setup模块都能为你提供详尽的硬件和软件资源数据。在这篇文章中,我们将一步步带你了解如何使用setup模块来收集主机信息,并且还会对比一下使用ansible命令和ansible-playbook这两种不同方法的优劣。

一、什么是Setup模块?

Ansible的setup模块可以帮你收集远程主机的各种信息,比如操作系统、硬件配置和网络设置等。这样你就能在自动化运维过程中随时了解目标主机的状态。这个模块支持很多不同的系统平台,并且收集到的数据格式统一,方便你后续处理。

setup 模块收集的信息包括:

  • 操作系统信息:如版本、发行版等
  • 网络信息:如IP地址、网关、DNS配置等
  • 内存、CPU配置:如内存总量、CPU核心数等
  • 存储信息:如磁盘设备、文件系统等
  • 主机名、架构等基本信息。

二、如何使用setup 模块

如果不知道setup的具体用法,可以通过执行ansible-doc setup查看帮助文档,如下图所示:

1. 命令行使用 setup 模块

最简单的方式是直接使用 ansible 命令行工具,调用setup 模块收集目标主机的信息。

示例 1:收集所有主机的系统信息

假设你希望对 all 组中的所有主机收集信息,使用以下命令:

ansible all -m setup
  • 1.

这条命令将会通过SSH登录到目标主机,并返回一个包含各类系统信息的JSON 输出。输出将包括目标主机的操作系统、内存、CPU、网络配置等详细信息。

示例 2:限制收集特定主机组的信息

如果你只对aliyun-server组的主机感兴趣,可以这样写:

ansible aliyun-server -m setup
  • 1.

该命令只会收集 aliyun-server 组中所有主机的系统信息。结果如下图所示:

2. 命令行使用 setup 模块收集特定信息

你还可以通过 filter 参数来只收集某些特定的事实数据。例如,如果你只关心主机的操作系统版本或内存信息,可以使用如下命令:

示例 3:只收集操作系统信息

ansible aliyun-server  -m setup -a "filter=ansible_distribution*"
  • 1.

该命令会仅返回主机的操作系统相关信息,例如:

web | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution": "Ubuntu",
        "ansible_distribution_file_parsed": true,
        "ansible_distribution_file_path": "/etc/os-release",
        "ansible_distribution_file_variety": "Debian",
        "ansible_distribution_major_version": "22",
        "ansible_distribution_release": "jammy",
        "ansible_distribution_version": "22.04",
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

示例 4:只收集内存信息

ansible aliyun-server -m setup -a "filter=ansible_memory_mb"
  • 1.

输出将仅显示目标主机的内存信息:

web | SUCCESS => {
    "ansible_facts": {
        "ansible_memory_mb": {
            "nocache": {
                "free": 276,
                "used": 1409
            },
            "real": {
                "free": 76,
                "total": 1685,
                "used": 1609
            },
            "swap": {
                "cached": 0,
                "free": 0,
                "total": 0,
                "used": 0
            }
        },
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

三、使用Playbook 调用setup模块

除了使用Ansible命令行之外,你还可以借助Ansible Playbook来收集系统信息。Playbook是Ansible中非常重要的工具,用于配置管理和自动化任务。它能够帮助你轻松地安排和执行多个任务,并且整个过程会非常清晰有序。希望这个方法对你有帮助!

1. Playbook示例:收集系统信息

以下是一个基本的Playbook示例,演示如何在Playbook中调用setup模块收集信息:

---
-name:Gathersysteminformation
hosts:test
tasks:
    -name:Collectsystemfacts
      setup:

    -name:DisplayOSversion
      debug:
        msg:"The OS version is {{ ansible_distribution_version }}"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

该Playbook会在目标主机上执行setup模块,收集系统信息,然后使用 debug模块显示操作系统的版本。你可以通过以下命令运行该Playbook:

ansible-playbook gather_system_facts.yml
  • 1.

成功执行后返回如下图所示:

2. Playbook 示例:过滤特定信息

你也可以通过filter参数来优化Playbook,只收集特定的系统信息。例如,以下 Playbook仅收集目标主机的内存信息:

---
-name:Gathersystemmemoryfacts
hosts:test
tasks:
    -name:Collectmemoryfacts
      setup:
        filter:ansible_memory_mb

    -name:Displaytotalmemory
      debug:
        msg:"Total memory is {{ ansible_memory_mb.real.total }} MB"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

运行该Playbook后,它只会返回并显示内存信息。

3. 综合案例

为了根据远程服务器的具体架构上传相应的软件包,我们可以利用Ansible的setup模块来获取服务器的架构信息。然后,通过使用条件判断(例如when子句),我们可以灵活地根据这些信息执行不同的操作。这样不仅提高了效率,还让整个过程变得更加智能和自动化。

以下Playbook实现了上述功能:

---
-name:Uploadsoftwarepackagebasedonarchitecture
hosts:all
gather_facts:yes
tasks:
    -name:Collectsystemarchitecture
      debug:
        msg:"The architecture of the server is {{ ansible_architecture }}"

    -name:Uploadx86_64softwarepackage
      copy:
        src:./packages/software_x86_64.rpm
        dest:/tmp/software.rpm
      when:ansible_architecture=="x86_64"

    -name:Uploadaarch64softwarepackage
      copy:
        src:./packages/software_aarch64.rpm
        dest:/tmp/software.rpm
      when:ansible_architecture=="aarch64"

    -name:Uploadi386softwarepackage
      copy:
        src:./packages/software_i386.rpm
        dest:/tmp/software.rpm
      when:ansible_architecture=="i386"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

如果软件包的文件名和架构信息一致,可以使用变量动态构造路径,上面的yaml文件可以简化如下:

---
-name:Uploadsoftwarepackagebasedonarchitecture
hosts:all
gather_facts:yes
tasks:
    -name:Collectsystemarchitecture
      debug:
        msg:"The architecture of the server is {{ ansible_architecture }}"
    -name:Uploadsoftwarepackagedynamically
      copy:
        src:"./packages/software_{{ ansible_architecture }}.rpm"
        dest:/tmp/software.rpm
      when:ansible_architecturein["x86_64","aarch64","i386"]
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

执行以下命令运行该Playbook:

ansible-playbook upload_package.yml
  • 1.

成功执行如下图所示:

四、ansible和playbook那个更好用?

在Ansible中,对setup模块的调用可以通过直接使用Ansible命令行工具或通过Playbook来实现。这两种方法各有特点,在实际应用中根据具体需求选择合适的方式至关重要。

  • 直接使用Ansible命令行工具:这种方式适用于需要快速获取目标主机信息的情况。通过执行类似 ansible <host> -m setup 的命令,可以直接查看指定主机上的系统信息、安装软件包等详细数据。这种方法简单快捷,适合于调试或是偶尔需要查看特定主机信息的场景。
  • 通过Playbook调用:当涉及到更复杂的配置管理任务时,推荐使用Playbook来组织和自动化整个过程。在这种情况下,可以在Playbook中定义一个或多个任务来调用setup模块,从而收集所需的信息。这种方法不仅能够更好地集成到自动化流程中,而且还支持更高级的功能如条件判断、循环处理等,使得信息收集过程更加灵活可控。

五、总结

setup模块是Ansible里的一个重要工具,用来收集目标主机的各种信息,比如操作系统、硬件配置和网络设置等,让你能快速了解主机的情况。 无论是命令行还是Playbook,它们都能够通过filter 参数精确收集所需的信息,避免不必要的数据冗余。

文章来自:51CTO

Loading

作者 yinhua

发表回复