Ansible执行aptitude查询可升级包时返回non-zero return code错误
问题原因
aptitude 从 0.8.x 版本开始调整了 search 子命令的返回值逻辑:
旧版本(如 0.7.4)只要命令本身执行无错误,无论是否匹配到搜索结果都会返回 0;
0.8.10 及更新版本中,如果 search 命令没有匹配到任何结果(对应当前系统没有可升级的软件包),就会返回 1。Ansible 的 shell 模块默认将非 0 返回码判定为执行失败,因此触发了报错,报错返回的 stdout 为空也对应了无匹配结果的场景。
解决方法
以下三种方案均可解决该兼容问题:
- 方案1:调整 shell 模块的返回码判定规则,明确指定 0 和 1 均为合法的成功返回码,修改后任务代码如下:
- name: List packages to upgrade (1/2) shell: aptitude -q -F%p --disable-columns search "~U" register: updates changed_when: False when: ansible_os_family == 'Debian' args: rc: [0, 1]
- 方案2:改用系统默认预装的 apt 命令实现相同需求,不需要依赖 aptitude,适配所有 Debian 系版本,返回值逻辑更稳定:
- name: List packages to upgrade (1/2) shell: apt list --upgradable 2>/dev/null | awk 'NR>1 {print $1}' | cut -d'/' -f1 register: updates changed_when: False when: ansible_os_family == 'Debian'
- 方案3:保持原有 aptitude 命令不变,在命令末尾主动修正返回值:
shell: aptitude -q -F%p --disable-columns search "~U" || exit 0
内容的提问来源于stack exchange,提问作者albertski
相关产品推荐
相关产品推荐

