Ansible Setup 模塊實戰,如何使用 Setup 模塊收集主機信息
在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 參數精確收集所需的信息,避免不必要的數據冗余。