如何解析Ansible yum模块更新输出以获取可读软件包列表
解决Ansible中yum check-update输出解析问题
我尝试在Ansible里实现和yum check-update等价的功能,只提取人类可读的软件包更新列表,写了下面的Playbook,结果执行时出错了。
我的错误Playbook代码
--- - name: check for updates hosts: localhost gather_facts: true tasks: - name: check for updates (yum) yum: list=updates update_cache=true register: yumoutput when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux' - debug: msg={{ yumoutput.stdout | from_json }}
遇到的错误信息
fatal: [localhost]: FAILED! => {"msg": "Unexpected templating type error occurred on ({{ yumoutput.stdout | from_json }}): expected string or buffer"}
问题原因分析
这里的核心问题是:当你用yum模块的list=updates参数时,模块返回的不是标准输出字符串,而是已经结构化的Ansible事实数据,根本不需要用from_json去解析。你错误地尝试解析yumoutput.stdout,但实际上这个字段要么不存在,要么不是你需要的结构化数据来源。
正确的解决方案
要获取可读的更新包列表,直接遍历yumoutput.results即可,这个字段里已经包含了所有更新包的详细信息。下面是修正后的Playbook:
--- - name: check for updates hosts: localhost gather_facts: true tasks: - name: check for updates (yum) yum: list: updates update_cache: true register: yumoutput when: ansible_distribution in ['CentOS', 'Red Hat Enterprise Linux'] - name: Display human-readable update list debug: msg: "{{ item.name }}: {{ item.old_version }} -> {{ item.new_version }}" loop: "{{ yumoutput.results }}" when: yumoutput is defined and yumoutput.results | length > 0
代码说明
- 调整了
yum模块的参数格式为YAML键值对,比旧的key=value格式更易读 - 不再尝试解析
stdout,直接使用yumoutput.results——这是yum模块返回的结构化列表,每个元素包含包名、旧版本、新版本等信息 - 通过
loop遍历所有更新包,格式化输出为包名: 旧版本 -> 新版本的人类可读格式 - 添加了条件判断,确保只有当存在更新数据时才执行输出任务
如果你只想简单列出所有需要更新的包名,也可以简化输出:
- name: List only package names needing updates debug: msg: "{{ item.name }}" loop: "{{ yumoutput.results }}" when: yumoutput is defined and yumoutput.results | length > 0
内容的提问来源于stack exchange,提问作者Garbageof
相关产品推荐
相关产品推荐

