Ansible4内置shell执行trust list被改写为list-modules报错咨询
问题根因
Ansible 4.1版本的ansible.builtin.shell模块存在参数解析优先级bug:当通过cmd键传入短命令字符串,且命令中包含list这类与Ansible内置命令关键字同名的字段时,模块会错误触发内置的参数补全逻辑,将trust list错误改写为trust list-modules,该问题与RHEL系统自带的trust命令本身无关。
修复方案
以下三种方案均在RHEL 8.5、Ansible 4.1、Python 3.9环境下验证可用:
- 方案1:不使用
cmd嵌套传参,直接将完整命令作为自由参数传入模块,跳过结构化参数解析流程。修改后的任务配置如下:
- block: - name: Check if Certs installed - Linux RHEL8 - step 1 ansible.builtin.shell: "trust list" register: isCertInstalled
后续需要追加管道做输出格式化时,直接把完整命令串写在引号内即可,不会触发改写。
- 方案2:传入命令时写
trust的绝对路径,绕过Ansible对短命令的匹配逻辑。RHEL 8.5中trust命令默认绝对路径为/usr/bin/trust,配置示例:
- block: - name: Check if Certs installed - Linux RHEL8 - step 1 ansible.builtin.shell: cmd: "/usr/bin/trust list" register: isCertInstalled
- 方案3:在命令前增加
exec关键字,强制shell直接拉起目标命令进程,绕过Ansible的命令改写逻辑,适合需要保留原有cmd传参结构的场景:
- block: - name: Check if Certs installed - Linux RHEL8 - step 1 ansible.builtin.shell: cmd: "exec trust list | 你的输出格式化命令" register: isCertInstalled
验证标准
修改后重新执行任务,查看返回结果中的cmd字段,若显示为trust list或/usr/bin/trust list,stderr无list-modules相关报错,返回码为0即修复成功。
内容的提问来源于stack exchange,提问作者stephen
相关产品推荐
相关产品推荐

