Ansible Setup模块实战,如何使用Setup模块收集主机信息
在Ansible
中,setup
模块是一个非常有用的工具,可以帮助你轻松地收集目标主机的各种系统信息。无论是想了解操作系统的版本、内存容量、CPU性能还是网络配置,setup
模块都能为你提供详尽的硬件和软件资源数据。在这篇文章中,我们将一步步带你了解如何使用setup
模块来收集主机信息,并且还会对比一下使用ansible
命令和ansible-playbook
这两种不同方法的优劣。
什么是Setup模块?
Ansible
的setup
模块可以帮你收集远程主机的各种信息,比如操作系统、硬件配置和网络设置等。这样你就能在自动化运维过程中随时了解目标主机的状态。这个模块支持很多不同的系统平台,并且收集到的数据格式统一,方便你后续处理。
setup
模块收集的信息包括:
- 操作系统信息:如版本、发行版等
- 网络信息:如
IP
地址、网关、DNS
配置等 - 内存、
CPU
配置:如内存总量、CPU
核心数等 - 存储信息:如磁盘设备、文件系统等
- 主机名、架构等基本信息。
如何使用setup
模块
如果不知道setup
的具体用法,可以通过执行ansible-doc setup
查看帮助文档,如下图所示:
命令行使用 setup
模块
最简单的方式是直接使用 ansible
命令行工具,调用setup
模块收集目标主机的信息。
- 示例 1:收集所有主机的系统信息
假设你希望对 all
组中的所有主机收集信息,使用以下命令:
ansible all -m setup
这条命令将会通过SSH
登录到目标主机,并返回一个包含各类系统信息的JSON 输出。输出将包括目标主机的操作系统、内存、CPU、网络配置等详细信息。
- 示例 2:限制收集特定主机组的信息
如果你只对aliyun-server
组的主机感兴趣,可以这样写:
ansible aliyun-server -m setup
该命令只会收集 aliyun-server
组中所有主机的系统信息。结果如下图所示:
命令行使用 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
中非常重要的工具,用于配置管理和自动化任务。它能够帮助你轻松地安排和执行多个任务,并且整个过程会非常清晰有序。希望这个方法对你有帮助!
Playbook示例:收集系统信息
以下是一个基本的Playbook
示例,演示如何在Playbook
中调用setup
模块收集信息:
---
- name: Gather system information
hosts: test
tasks:
- name: Collect system facts
setup:
- name: Display OS version
debug:
msg: "The OS version is {{ ansible_distribution_version }}"
该Playbook
会在目标主机上执行setup
模块,收集系统信息,然后使用 debug
模块显示操作系统的版本。你可以通过以下命令运行该Playbook
:
ansible-playbook gather_system_facts.yml
成功执行后返回如下图所示:
Playbook 示例:过滤特定信息
你也可以通过filter
参数来优化Playbook
,只收集特定的系统信息。例如,以下 Playbook
仅收集目标主机的内存信息:
---
- name: Gather system memory facts
hosts: test
tasks:
- name: Collect memory facts
setup:
filter: ansible_memory_mb
- name: Display total memory
debug:
msg: "Total memory is {{ ansible_memory_mb.real.total }} MB"
运行该Playbook
后,它只会返回并显示内存信息。
综合案例
为了根据远程服务器的具体架构上传相应的软件包,我们可以利用Ansible
的setup
模块来获取服务器的架构信息。然后,通过使用条件判断(例如when
子句),我们可以灵活地根据这些信息执行不同的操作。这样不仅提高了效率,还让整个过程变得更加智能和自动化。
以下Playbook
实现了上述功能:
---
- name: Upload software package based on architecture
hosts: all
gather_facts: yes
tasks:
- name: Collect system architecture
debug:
msg: "The architecture of the server is {{ ansible_architecture }}"
- name: Upload x86_64 software package
copy:
src: ./packages/software_x86_64.rpm
dest: /tmp/software.rpm
when: ansible_architecture == "x86_64"
- name: Upload aarch64 software package
copy:
src: ./packages/software_aarch64.rpm
dest: /tmp/software.rpm
when: ansible_architecture == "aarch64"
- name: Upload i386 software package
copy:
src: ./packages/software_i386.rpm
dest: /tmp/software.rpm
when: ansible_architecture == "i386"
如果软件包的文件名和架构信息一致,可以使用变量动态构造路径,上面的yaml文件可以简化如下:
---
- name: Upload software package based on architecture
hosts: all
gather_facts: yes
tasks:
- name: Collect system architecture
debug:
msg: "The architecture of the server is {{ ansible_architecture }}"
- name: Upload software package dynamically
copy:
src: "./packages/software_{{ ansible_architecture }}.rpm"
dest: /tmp/software.rpm
when: ansible_architecture in ["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
参数精确收集所需的信息,避免不必要的数据冗余。
推荐阅读
- 从入门到精通:Ansible Shell 模块的应用与最佳实践
- 深入了解Ansible配置与主机清单:轻松管理自动化任务
- 效率提升神器:Ansible入门,开启自动化运维之旅
- Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
- ncdu:Linux磁盘分析的利器,你值得拥有
- Linux磁盘爆满?别慌!这几个命令轻松搞定