1. 概述
Ansible 是一个强大的配置管理工具,其核心功能之一是通过 Playbook 自动化执行一系列任务。Playbook 中的任务通常会在目标服务器上运行命令,但 默认情况下 Ansible 并不会将命令输出打印到终端,这给调试和监控带来了不便。
本文将介绍几种在 Ansible Playbook 中打印远程服务器命令输出的方法,帮助你更好地掌握任务执行过程。
2. 使用 Verbose 模式
最简单的方式是使用 -v
参数启动 verbose 模式,它会将所有命令的输出以 JSON 格式打印到终端。
我们以一个简单的 Playbook check_resources.yml
为例,用于检查服务器内存使用情况:
---
- name: Checking System Resources
hosts: web-servers
tasks:
- name: Check Memory Usage
command: free
运行 Playbook 时添加 -v
参数:
$ ansible-playbook check_resources.yml -v
输出如下(简化显示):
{
"stdout": " total used free shared buff/cache available\nMem: 980416 367084 219444 916 568032 613332\nSwap: 0 0 0",
"stdout_lines": [...]
}
✅ 优点:快速查看所有命令输出
❌ 缺点:输出冗余,难以聚焦关键信息,尤其在复杂 Playbook 中
3. 打印单个命令输出
Ansible 提供了两个模块用于精确控制输出:
register
:将命令执行结果保存到变量中debug
:打印变量内容
我们修改 Playbook 如下:
---
- name: Checking System Resources
hosts: web-servers
tasks:
- name: Check Memory Usage
command: free
register: print_memory_usage
- debug:
var: print_memory_usage.stdout_lines
执行后输出如下:
TASK [Print Memory Usage] *****************************************************************************
ok: [172.31.4.218] => {
"print_memory_usage.stdout_lines": [
" total used free shared buff/cache available",
"Mem: 980416 360224 226288 916 568056 620192",
"Swap: 0 0 0"
]
}
✅ 优点:结构清晰,只输出指定命令结果
⚠️ 踩坑提醒:stdout_lines
是列表形式,适合逐行展示;如需字符串输出,可用 stdout
4. 打印多个命令输出
当需要输出多个命令的执行结果时,可以为每个命令分配一个变量,并分别使用 debug
打印:
---
- name: Checking System Resources
hosts: web-servers
tasks:
- name: Check Memory Usage
command: free
register: print_memory_usage
- name: Check Disk Usage
command: df /dev/root -h
register: print_disk_usage
- name: Print Memory Usage
debug:
var: print_memory_usage.stdout_lines
- name: Print Disk Usage
debug:
var: print_disk_usage.stdout_lines
执行结果如下:
TASK [Print Memory Usage] *****************************************************************************
ok: [172.31.4.218] => {
"print_memory_usage.stdout_lines": [
" total used free shared buff/cache available",
"Mem: 980416 360876 225116 916 568576 619540",
"Swap: 0 0 0"
]
}
TASK [Print Disk Usage] *****************************************************************************
ok: [172.31.4.218] => {
"print_disk_usage.stdout_lines": [
"Filesystem Size Used Avail Use% Mounted on",
"/dev/root 6.8G 2.0G 4.8G 30% /"
]
}
✅ 优点:灵活控制多个命令输出,结构清晰
⚠️ 踩坑提醒:变量名不要重复,避免覆盖
5. 总结
在 Ansible Playbook 中打印命令输出有以下两种主要方式:
方法 | 描述 | 适用场景 |
---|---|---|
使用 -v 参数 |
全局输出所有命令执行结果 | 快速调试简单 Playbook |
使用 register + debug |
精确控制输出特定命令 | 复杂 Playbook 或需要结构化输出 |
推荐做法:优先使用 register
和 debug
模块,这样能获得更清晰、更可控的输出结果。
进阶建议:可结合 when
条件判断,只在满足条件时打印输出,进一步提升调试效率。