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 或需要结构化输出

推荐做法:优先使用 registerdebug 模块,这样能获得更清晰、更可控的输出结果。
进阶建议:可结合 when 条件判断,只在满足条件时打印输出,进一步提升调试效率。


原始标题:Print Command Output in Ansible