在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
这条命令将会通过SSH登录到目标主机,并返回一个包含各类系统信息的JSON 输出。输出将包括目标主机的操作系统、内存、CPU、网络配置等详细信息。
示例 2:限制收集特定主机组的信息
如果你只对aliyun-server组的主机感兴趣,可以这样写:
ansible aliyun-server -m setup
该命令只会收集 aliyun-server 组中所有主机的系统信息。结果如下图所示:
2. 命令行使用 setup 模块收集特定信息
你还可以通过 filter 参数来只收集某些特定的事实数据。例如,如果你只关心主机的操作系统版本或内存信息,可以使用如下命令:
示例 3:只收集操作系统信息
ansible aliyun-server -m setup -a "filter=ansible_distribution*"
该命令会仅返回主机的操作系统相关信息,例如:
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
}
示例 4:只收集内存信息
ansible aliyun-server -m setup -a "filter=ansible_memory_mb"
输出将仅显示目标主机的内存信息:
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
}
三、使用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 }}"
该Playbook会在目标主机上执行setup模块,收集系统信息,然后使用 debug模块显示操作系统的版本。你可以通过以下命令运行该Playbook:
ansible-playbook gather_system_facts.yml
成功执行后返回如下图所示:
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"
运行该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"
如果软件包的文件名和架构信息一致,可以使用变量动态构造路径,上面的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"]
执行以下命令运行该Playbook:
ansible-playbook upload_package.yml
成功执行如下图所示:
四、ansible和playbook那个更好用?
在Ansible中,对setup模块的调用可以通过直接使用Ansible命令行工具或通过Playbook来实现。这两种方法各有特点,在实际应用中根据具体需求选择合适的方式至关重要。
- 直接使用Ansible命令行工具:这种方式适用于需要快速获取目标主机信息的情况。通过执行类似 ansible <host> -m setup 的命令,可以直接查看指定主机上的系统信息、安装软件包等详细数据。这种方法简单快捷,适合于调试或是偶尔需要查看特定主机信息的场景。
- 通过Playbook调用:当涉及到更复杂的配置管理任务时,推荐使用Playbook来组织和自动化整个过程。在这种情况下,可以在Playbook中定义一个或多个任务来调用setup模块,从而收集所需的信息。这种方法不仅能够更好地集成到自动化流程中,而且还支持更高级的功能如条件判断、循环处理等,使得信息收集过程更加灵活可控。
五、总结
setup模块是Ansible里的一个重要工具,用来收集目标主机的各种信息,比如操作系统、硬件配置和网络设置等,让你能快速了解主机的情况。 无论是命令行还是Playbook,它们都能够通过filter 参数精确收集所需的信息,避免不必要的数据冗余。